把别人的图片拿来做网站,网站建设制作临沂网站建设选盛誉,黄石市网站建设,福州做网站制作一、数组名的理解
int arr[10]{1,2,3,4,5,6,7,8,9,10};
int *parr[0]; 这里使用 arr[0] 的⽅式拿到了数组第⼀个元素的地址#xff0c;但是其实数组名本来就是地址#xff0c;而且是数组首元素的地址。如下#xff1a; 我们发现数组名和数组⾸元素的地址打印出…一、数组名的理解
int arr[10]{1,2,3,4,5,6,7,8,9,10};
int *parr[0]; 这里使用 arr[0] 的⽅式拿到了数组第⼀个元素的地址但是其实数组名本来就是地址而且是数组首元素的地址。如下 我们发现数组名和数组⾸元素的地址打印出的结果⼀模⼀样数组名就是数组⾸元素(第⼀个元素)的地址。
数组名如果是数组首元素的地址那下⾯的代码怎么理解呢
#include stdio.h
int main()
{int arr[10] { 1,2,3,4,5,6,7,8,9,10 };printf(%d\n, sizeof(arr));return 0;
}
输出的结果是40。 如果arr是数组⾸元素的地址那输出应该的应该是4/8才对。 其实数组名就是数组首元素(第⼀个元素)的地址是对的但是有两个例外 ①sizeof(数组名)sizeof中单独放数组名这里的数组名表示整个数组计算的是整个数组的大小单位是字节 ②数组名这里的数组名表示整个数组取出的是整个数组的地址整个数组的地址和数组首元素的地址是有区别的 除此之外任何地方使用数组名数组名都表示首元素的地址。 这里我们发现arr[0]和arr[0]1相差4个字节arr和arr1 相差4个字节是因为arr[0] 和 arr 都是首元素的地址1就是跳过一个元素。但是arr 和 arr1相差40个字节这就是因为arr是数组的地址1 操作是跳过整个数组的。
二、使用指针访问数组 数组在内存中是连续存放的 指针的加减运算方便我们获得每一个元素的地址 #includestdio.h
int main()
{int arr[10] { 0 };//使用指针来访问数组int sz sizeof(arr) / sizeof(arr[0]);//输入10个值int* p arr;int i 0;for (i 0; i sz; i){//输入scanf(%d, p i);//pi arr[i]}//输出10个值for (i 0; i sz; i){printf(%d , *(p i));}return 0;
}
数组名arr是数组首元素的地址可以赋值给p数组名arr和p这里是等价的。 p[i]等价于*(pi)arr[i]等价于*(arri)数组元素在访问编译器处理的时候也是转换成首元素的地址 偏移量求出元素的地址然后解引用来访问。 1.数组就是数组是一块连续的空间数组的大小和数组元素类型都有关系 2.指针变量就是指针变量是一个变量4/8个字节 3.数组名是地址是首元素的地址 4.可以使用指针来访问数组 拓展 三、一维数组传参的本质
我们之前都是在函数外部计算数组的元素个数那我们可以把函数传给一个函数后函数内部求元素个数吗 我们发现在函数内部没有正确获得数组的元素个数。 这就要学习数组传参的本质了上篇文章写道数组名是数组⾸元素的地址那么在数组传参的时候传递的是数组名也就是说本质上数组传参本质上传递的是数组首元素的地址。 所以函数形参的部分理论上应该 使用指针变量来接收首元素的地址 。那么在函数内部我们写 sizeof(arr) 计算的是⼀个地址的大小单位字节而不是数组的大小单位字节。正是因为 函数的参数部分是本质是指针 所以在函数内部是没办法求的数组元素个数的。 1. 数组传参的本质是传递了数组首元素的地址所以形参访问的数组和实参的数组是同一个数组。 2.形参的数组是不会单独再创建数组空间的所以形参的数组是可以省略数组大小的。 结论一维数组传参形参的部分可以写成数组的形式也可以写成指针的形式。本质上是指针变量 。 四、二级指针
指针变量是变量是变量就有地址那指针变量的地址存放在哪里呢这就是二级指针。
int**就是二级指针 *pp通过对pp中的地址解引用这样找到的是p*pp其实访问的就是p **pp先通过*pp找到p然后对p进行解引用操作找到的就是a。 五、指针数组
整型数组是存放整型的数组字符数组是存放字符的数组那么指针数组是存放指针的数组。 指针数组的每个元素是地址又可以指向一块区域。
六、指针数组模拟二维数组
#includestdio.h
int main()
{int arr1[] { 1,2,3,4,5 };int arr2[] { 2,3,4,5,6 };int arr3[] { 3,4,5,6,7 };int* parr[3] { arr1,arr2,arr3 };//打印数组int i 1;for (i 0; i 3; i){int j 0;for (j 0; j 5; j){printf(%d , parr[i][j]);}printf(\n);}return 0;
} 画图演示 *(arr1j)arr1[j] *(*(arri)j)arr[i][j] parr[i]是访问parr数组的元素parr[i]找到的数组元素指向了整型⼀维数组parr[i][j]就是整型⼀维数组中的元素。 上述的代码模拟出二维数组的效果实际上并非完全是二维数组因为每一行并非是连续的。