巨量算数官方入口,百度优化排名软件,wordpress 伪静态 后台,郑州企业网站模板建站正文开始——数组与指针是紧密联系的
#xff08;一#xff09;数组名的理解
#xff08;1#xff09;数组名是数组首元素的地址 int arr[10] {1,2,3,4,5,6,7,8,9,10};
int *parr arr[0]; 上述代码通过arr[0] 的方式得到了数组第一个元素的地址#xff0c;… 正文开始——数组与指针是紧密联系的
一数组名的理解
1数组名是数组首元素的地址 int arr[10] {1,2,3,4,5,6,7,8,9,10};
int *parr arr[0]; 上述代码通过arr[0] 的方式得到了数组第一个元素的地址但其实数组名本身就是一个地址并且是数组首元素的地址。 代码1
#includestdio.h
int main()
{int arr[6] { 1,2,3,4,5,6};printf(%p\n,arr);printf(%p\n,arr[0]);return 0;
} 结果 数组名与数组首元素的地址打印出的结果是一样的。于是数组名就是数组首元素第一个元素的地址。 2两个例外
代码2
#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;
}
结果 令我们出乎所料的是这里的数组名不再是数组首元素的地址而是表示整个数组。
对于代码中出现的数组名不违背数组名是数组第一个元素的的地址也就是说 数组名是数组首元素的地址是对的但是有两个例外 • sizeof(数组名)sizeof中单独放数组名这里的数组名代表整个数组sizeof计算的是整个数组的大小单位是字节 • 数组名这的数组名代表整个数组取出的是整个数组的地址整个数组的地址和数组首元素的地址是有区别的 除此之外其他地方使用数组名都代表的是数组首元素的地址。
那么数组名与数组名具体有什么区别 通过指针运算就可以体现出他们的区别
代码3
printf(arr[0] %p\n, arr[0]);printf(arr[0]1 %p\n, arr[0]1);printf(arr %p\n, arr);printf(arr1 %p\n, arr1);printf(arr %p\n, arr);printf(arr1 %p\n, arr1); 结果 arr[0] 和 arr[0] 1 相差4个字节arr 和 arr 1 相差 4个字节原因是arr[0] 和arr 都是数组arr 首元素的地址通过指针运算 1 就是跳过一个int型的元素也就是跳过4个字节。 arr 和 arr 1 相差40个字节原因是arr是数组的地址指针运算 1 就是跳过整个数组 int [10] 型元素也就是10个整形40个字节。 二函数内数组传参
1一维数组传参 相信你一定使用过冒泡排序吧; 将数组传址和数组内元素个数传给函数
int main()
{int arr[10] {5,4,8,7,9,6,3,2,1,0};int sz1 sizeof(arr)/sizeof(arr[0]);Bobble_sort(arr,sz1);Print();return 0;
}
就会得到排序好的数组。 观察上述操作我们都是在函数外部计算数组的元素个数那我们可以把数组传给⼀个函 数后函数内部求数组的元素个数吗
#include stdio.hvoid test(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]);printf(sz1 %d\n, sz1);test(arr);return 0;
}
结果(在x86下) 为什么传给函数的是数组结果sizeof计算整个数组的的大小 4 字节呢 这就要学习数组传参的本质了上个小节我们学习了数组名是数组首元素的地址那么在数组传参的时候传递的是数组名也就是说数组传参本质上传递的是数组首元素的地址。 所以函数形参的部分理论上应该使用指针变量来接收首元素的地址。 void Bobble_sort(int* p,int sz)
{.......
}int main()
{int arr[5] {1,2,3,4,5};int sz sizeof(arr)/sizeof(arr[0]);Bobble_sort(arr,sz);return 0;
} 那么在函数内部我们写sizeof(arr) 计算的是⼀个地址的大小单位字节而不是数组的大小单位字节。正是因为函数的参数部分是本质是指针所以在函数内部是没办法求的数组元素个数的。 2二维数组传参 二维数组传参以上的结论仍成立 数组传参本质上传递的是数组首元素的地址。 二维数组的首元素不再是一个基本的数据类型而是一个数组类型。 什么是数组类型 如果一个数组是整形数组元素是5个整形那么他的类型就是 int [5] 类型。 二维数组首元素的地址其数据类型就是int *[5]类型。 那么在主函数内未传参sizeof二维数组的数组名计算的就是整个二维数组大小
传参后sizeof二维数组名的结果就是指针int *[5]的大小了。所有类型函数其地址的大小是一定的
3三维及高维数组传参 仍然满足 数组传参本质上传递的是数组首元素的地址。
这里我们来看一段代码
#includestdio.hvoid PR(int (*p)[3][3])
{}
int main()
{int arr[3][3][3];PR(arr);return 0;
} 解释 数组arr的首元素类型是int [3][3],在传参的时候可以用指针类型int*[3][3]来接收类型是照应的。这也说明 arr传递的是首元素的地址 完~
未经作者同意禁止转载