C语言指针(2)

今天我们接着前两天的内容继续讲解

一、数组名的理解

1、&arr[0]与arr

有时候我们需要获取数组首元素,有两种方法可以获取。

使用这两种方法都可以获得数组首元素&arr[0],arr。

int main()
{int arr[10] = { 1,2,3,4,5,6,7,8,9,10};printf("%d ", &arr[0]);printf("%d ", arr);return 0;
}

输出:

输出的内容就是首元素的地址。

int main()
{int arr[10] = { 1,2,3,4,5,6,7,8,9,10};printf("%d\n", sizeof(arr));return 0;
}

输出:

对于这一题同学们就疑惑了,不是arr可以获得数组首元素地址吗,怎么在这段代码中就不是了。

有两种情况:

1、sizeof(数组名)单独存在sizeof中的数组名是用来求数组大小的。

2、&数组名,这是用来获取整个数组地址的。

2、&arr与arr

int main()
{int arr[10] = { 1,2,3,4,5,6,7,8,9,10};printf("%d\n", &arr);printf("%d\n", arr);return 0;
}

输出:

我们发现获取整个数组地址跟获取数组首元素地址打印出来的地址是一样的,那到底他们有什么不一样呢,如果我们把这两个都+1会是什么效果。

int main()
{int arr[10] = { 1,2,3,4,5,6,7,8,9,10};printf("%d\n", &arr);printf("%d\n", &arr + 1);printf("%d\n", arr);printf("%d\n", arr+1);printf("%d\n", &arr[0]);printf("%d\n", &arr[0]+1);return 0;
}

输出:

数组之间元素的间距是一个int类型,一个int类型等于4个字节。

我们看见,&arr+ 1,跳过了整个数组,就是40个字节。

而arr+1跳过了一个int类型,那就是3个字节。

二、使⽤指针访问数组

void add(int* p, int sz)
{for (int i = 0; i < sz; i++){printf("%d ", *(p + i));}
}int main()
{int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };int sz = sizeof(arr) / sizeof(arr[0]);add(arr, sz);return 0;
}

输出:

在以前的时候,我们在接收函数传过去实参的时候,都是使用形参来接收。

void add(int* p, int sz),大家可以看见,我们使用指针同样是可以接收传过去的数组的,p指针接收的是arr数组中首元素的地址。通过循环语句从首元素打印,一直打印完数组全部。

printf("%d ", *(p + i));这一行代码,*(p+i)等于p[i],这两种写法都可以,在编译器编译的时候,是通过指针实现的。

*(p + i),
*(p+0)=1
*(p+1)=2
*(p+2)=3
……
*(p+9)=10

那么同样通过指针输入数值到数组里吗?

当然也是可以的:

void add(int* p, int sz)
{for (int i = 0; i < sz; i++){printf("%d ", *(p + i));}
}int main()
{int arr[10] = { 0 };int sz = sizeof(arr) / sizeof(arr[0]);int* p = arr;for (int i = 0; i < sz; i++){scanf("%d", p+i); //arr+i也可以}add(arr, sz);return 0;
}

三、一维数组的传参本质

void add(int arr[ ])
{int sz2 = sizeof(arr) / sizeof(arr[0]);printf("sz2=%d\n", sz2);
}int main()
{int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };int sz1 = sizeof(arr) / sizeof(arr[0]);add(arr);printf("sz1=%d\n", sz1);return 0;
}

输出:

sz1与sz2为什么得到的结果不一样呢。

因为在函数add中,传过去的是arr[ ] 这并不是整个数组的地址,而不是数组首元素的地址。

void add(int* arr) //int* arr = int arr[0]
{int sz3 = sizeof(arr) / sizeof(arr[0]);printf("sz3=%d\n", sz3);
}

我们也可以通过指针传参把首元素给传过去。

总结:一维数组传参可以使用指针来传,也可以通过数组形式来传参

四、⼆级指针

二级指针指向的是一级指针。

int main()
{int a = 10;int* pa = &a;int** paa = &pa;return 0;
}

**paa = 30;

printf("%d\n", a);//输出30;

**paa可以直接修改a变量的,因为**paa中存放的是*pa,而*p存放的是a的地址。

五、指针数组

数组指针是存放指针的数组

六、指针数组模拟⼆维数组

int main()

{

       int arr1[5] = {1,2,3,4,5};

       int arr2[5] = {2,3,4,5,6};

       int arr3[5] = {3,4,5,6,7};

       int* arr[3] = { arr1,arr2,arr3 };

       for (int i = 0; i < 3; i++)

       {

              for (int j = 0; j < 5; j++)

              {

                     printf("%d ", arr[i][j]);

              }

              printf("\n");

       }

       return 0;

}

可以看见,我们通过使用一维数组实现了二维数组,代码中最重要的一点就是指针数组,指针数组把一维数组中首元素地址给放到了一个数组中,我们通过循环遍历就可以打印出每个一维数组中的值。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/391593.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

物理笔记-八年级上册

0.梦开始的地方 物理研究什么&#xff1f; 电学&#xff0c;力学&#xff0c;声学&#xff0c;光学&#xff0c;热学。 1.1.1长度的单位 国际基本单位制 单位转换 魔法记忆&#xff1a;千米-米-毫米-微米-纳米&#xff08;进率都是1000&#xff09; 单位换算计算方法 用科学…

web高可用群集架构部署----超详细

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:Linux运维老纪的首页…

Leaf分布式ID

文章目录 系统对Id号的要求UUIDsnowflakeLeafLeaf-snowflakeLeaf-segmentMySQL自增主键segment双buffer 系统对Id号的要求 1、业务 1&#xff09;全局唯一性&#xff1a;不能出现重复的ID号&#xff0c;既然是唯一标识&#xff0c;这是最基本的要求 2&#xff09;趋势递增&a…

贪心系列专题篇四

​​​​​​​ 目录 整数替换 解法一 解法二 俄罗斯套娃信封问题 堆箱子 可被三整除的最大和 距离相等的条形码 重构字符串 声明&#xff1a;接下来主要使用贪心法来解决问题&#xff01;&#xff01;&#xff01; 整数替换 题目 思路 下面将使用两种方法来解决这…

【数据结构】算法的时间复杂度与空间复杂度

计算机考研408-数据结构笔记本之——第一章 绪论 1.2 算法和算法评价 1.2.2 算法效率的度量 算法效率的度量是通过时间复杂度和空间复杂度来描述的。 1.时间复杂度 时间复杂度T(n)是事前预估算法时间开销T(n)与问题规模 n 的关系&#xff08;T 表示 “time”&#xff09;&a…

眼在手外-机器人坐标系与相机坐标系标定方法

1 眼在手外坐标系概述 实现机械臂和相机的手眼标定&#xff0c;就是要通过双目相机坐标系、机械臂坐标系和机械臂 末端执行器三者的坐标系转换&#xff0c;求出手眼转换矩阵。设双目相机坐标系为 Oc&#xff0c;标定板坐标 系为 Ow&#xff0c;末端执行器坐标系为 Oe&#xff0…

【C++】二维数组定义方式

二维数组有四种定义方式 1、数据类型 数组名[行数 ][ 列数 ]; 2、数据类型 数组名[ 行数 ][ 列数 ]{{数据1&#xff0c;数据2}&#xff0c;{数据3&#xff0c;数据4 }}; 3、数据类型 数组名[ 行数 ][ 列数 ]{数据1&#xff0c;数据2&#xff0c;数据3&#xff…

Java | Leetcode Java题解之第321题拼接最大数

题目&#xff1a; 题解&#xff1a; class Solution {public int[] maxNumber(int[] nums1, int[] nums2, int k) {int m nums1.length, n nums2.length;int[] maxSubsequence new int[k];int start Math.max(0, k - n), end Math.min(k, m);for (int i start; i < e…

04 表的操作

目录 创建查看修改删除 1. 创建 语法&#xff1a; CREATE TABLE table_name ( field1 datatype, field2 datatype, field3 datatype ) character set 字符集 collate 校验规则 engine 存储殷勤; 说明&#xff1a; field&#xff0c;表示列名 datatype&#xff0c;表示列的类型…

C++ 继承 派生类的拷贝构造

继承 派生类的拷贝构造构造顺序拷贝构造 引例1: 当子类,不自实现拷贝构造时,默认调用父类的拷贝构造引例2: 子类自实现拷贝构造,不做特殊处理时,只会调用父类的构造器.引例3: 显示的调用父类的拷贝构造器。案例: 内嵌函数的拷贝构造 引例1 :当内嵌子对象,子类不自实现拷贝构造时…

【java】单行注释(//)与多选注释(/* */)

文章目录 单行注释多行注释注意事项 在Java中&#xff0c;注释是用来给代码添加说明的&#xff0c;它不会被编译器执行。Java提供了两种主要的注释方式&#xff1a;单行注释和多行注释&#xff08;有时也称为块注释或块级注释&#xff09;。 单行注释 单行注释以两个正斜杠&…

数模评价决策类—熵权法

目录 文章目录 前言 一、熵权法是什么&#xff1f; 二、基本步骤 计算样本权重及熵权 总结 前言 前面我们学习了层次分析法和Topsis法&#xff0c;这两个方法都是偏主观的方法&#xff0c;这篇我们将运用较为客观的方法——熵权法&#xff0c;做出决策 一、熵权法是什么…

JavaWeb-HTML

一、HTML&CSS&JavaSript的作用: 1.HTML主要用于网页为主体结构的搭建&#xff1b; 2.CSS主要用于页面元素的美化 3.JavaScript主要用于页面元素的动态处理; 二、HTML HTML是Hyper Text Markup Language的缩写。意思是超文本标记语言。它的作用是搭建网页结构&…

2024死磕小红书,一定能赚到钱!

​2024死磕小红书&#xff0c;一定能赚到钱&#xff01;在文末领取小红书运营完全指南电子书 从2023年起&#xff0c;小红书这股热乎劲儿就像开了挂&#xff0c;突然间就成了人人想蹭的“显学”。大伙儿都想趁着平台红利期&#xff0c;分一杯羹。说来惭愧&#xff0c;我从2020年…

牛顿插值法代替泰勒公式

引入 例题 近似函数&#xff1a; 通过这个近似函数可以看出&#xff0c;若要证的函数超过二阶可导&#xff0c;那么就不适合用牛顿插值法代替泰勒公式 因为&#xff0c;后面的操作非常复杂&#xff0c;不划算了… 总结 我们可以通过牛顿插值法生成一个逼近曲线的直线&#xf…

使用Python库开发Markdown编辑器并将内容导出为图片

简介 在本文中&#xff0c;我们将探索如何使用Python的wxPython库开发一个Markdown编辑器应用程序。这个应用程序不仅能浏览和编辑Markdown文件&#xff0c;还可以将编辑的内容导出为PNG图片。 C:\pythoncode\new\markdowneditor.py 完整代码 import wx import markdown2 im…

【传知代码】实体关系抽取(论文复现)

当谈论信息提取领域的最前沿时&#xff0c;实体关系抽取无疑是其中一颗耀眼的明星。从大数据时代的信息海洋中提炼出有意义的关系&#xff0c;不仅是科技进步的体现&#xff0c;更是人类对知识管理和智能决策迫切需求的响应。本文将探索实体关系抽取的核心技术、应用场景及其在…

太阳光模拟器在光纤中的应用

概述 太阳光模拟器是一种重要的实验室设备&#xff0c;它能模拟太阳光的光谱、强度和角度分布&#xff0c;广泛应用于光纤通信、光电器件测试、太阳能研究等多个领域。通过模拟太阳光的光照条件&#xff0c;研究人员可以在实验室环境中对光电材料和器件进行性能测试和研究。 太…

二维码生成原理及解码原理

☝☝☝二维码配图 二维码 二维码&#xff08;Quick Response Code&#xff0c;简称QR码&#xff09;是一种广泛使用的二维条形码技术&#xff0c;由日本公司Denso Wave在1994年开发。二维码能有效地存储和传递信息&#xff0c;广泛应用于商品追溯、支付、广告等多个领域。二维…

c++入门基础(下篇)————引用、inline、nullptr

引用 引用的概念和定义 引⽤不是新定义⼀个变量&#xff0c;⽽是给已存在变量取了⼀个别名&#xff0c;编译器不会为引⽤变量开辟内存空间&#xff0c; 它和它引⽤的变量共⽤同⼀块内存空间。 类型& 引用别名 引用对象; 就像孙悟空也叫齐天大圣 猪八戒也叫天蓬元帅。…