网站建设哪些好app小程序
web/
2025/9/28 20:58:31/
文章来源:
网站建设哪些好,app小程序,网络营销主要内容,账号注册网站在指针浅谈(二)http://t.csdnimg.cn/SKAkD中我们讲到了const修饰指针、指针运算、野指针、assert断言和传址调用的内容#xff0c;今天我们继续学习有关数组名、指针访问数组、一维数组传参的本质相关的内容#xff0c;内容比较深入#xff0c;如果觉得哪里讲解的不行#… 在指针浅谈(二)http://t.csdnimg.cn/SKAkD中我们讲到了const修饰指针、指针运算、野指针、assert断言和传址调用的内容今天我们继续学习有关数组名、指针访问数组、一维数组传参的本质相关的内容内容比较深入如果觉得哪里讲解的不行可以参考其他大佬的文章呦。
1.数组名的理解 在之前我们使用指针访问数组时有以下代码
int arr[10]{1,2,3,4,5,6,7,8,9,10};
int* parr[0]; 这里arr[0]表示取出数组第一个元素的地址赋给指针变量p但是你看下面这个代码和运行结果
#includestdio.h
int main()
{int arr[10]{1,2,3,4,5,6,7,8,9,10};printf(arr[0]%p\n,arr[0]);printf(arr%p,arr);return 0;
} 你会神奇的发现wc这出错了吧这怎么可能数组名的地址怎么能和数组第一个元素的地址相同呢但事实上数组名就是数组首元素的地址。 这时候倘若我放出下面这段代码阁下该如何应对
#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;
}我直接懵逼了到底哪个是对的其实两个都是对的数组名确实是数组首元素的地址但在两个情况下是例外的 1sizeof(数组名):sizeof中放数组名数组名表示整个数组计算整个数组的大小。 2数组名这里的数组名表示整个数组取出的是整个数组的地址这和首元素的地址是有区别的。区别就在于下面这段代码
#include stdio.h
int main()
{int arr[10] { 1,2,3,4,5,6,7,8,9,10 };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);return 0;
}我们发现arr[0]和arr[0]1相差4个字节arr和arr1相差4个字节这是我们意料之中的毕竟数组名是数组首元素的地址但arr和arr1相差40个字节这是因为arr是数组的地址1之后直接跳过整个数组虽然它和数组首元素地址相同但区别就在于指针-运算跳过的多少。 总的来说数组名是数组首元素的地址但是有sizeof和数组名两个意外。
2.使用指针访问数组 讲的是指针那我们就要用指针已经知道了这么多关于数组的知识就应该学习如何用指针访问数组。
#include stdio.h
int main()
{int arr[10] {0};int i 0;int sz sizeof(arr)/sizeof(arr[0]);//输⼊int* p arr;for(i0; isz; i){scanf(%d, pi);//scanf(%d, arri);//也可以这样写//scanf(%d, arr[i]);//scanf(%d, p[i]);}//输出for(i0; isz; i){printf(%d , *(pi));printf(%d , p[i]);//或者这样写printf(%d , arr[i]);}return 0;
} 这段代码怎么理解呢其实并不难将数组首元素的地址赋给了指针变量p那我们就可以访问整个数组毕竟数组是一段连续的存储空间知道了首元素地址就可以顺藤摸瓜找到其他元素运用指针运算遍历整个数组进行赋值因为数组首元素也是地址相当于一个指针所以也可以写成arri等价于arr[i]。其实数组名arr和p在这里等价所以也可以是p[i]输出时我们需对指针变量解引用获取元素值即可。
3.一维数组传参的本质 我们知道数组是可以传递给函数的那数组是把自己所有元素全部传过去吗显然不是在早期的计算机设备中内存是很小的如果一下传很多元素过去会很占用内存效率低下那数组是怎么传过去呢下面就让我们了解一下。 之前我们都是在函数外部计算数组的元素个数那能不能在函数内部进行求解呢
#include stdio.h
void test(int arr[])//形参也可以写成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;
} 我们发现其实并不能这样做这时候就要学习数组传参的本质了刚才学到数组名是数组首元素的地址那传参传的是数组名也就是说本质上数组传参传递的是数组首元素的地址。 所以函数形参应该使用指针变量来接收首元素地址那我们在函数内部写sizeof(arr)计算的是一个地址的大小不是数组的大小正是因为这样我们在函数内部是没有办法求数组元素个数的。 今天的指针先讲到这里下期再见
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/83526.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!