二级指针偏移
#include <stdio.h> void test_fuc(int b[][3]) { ++b; b[1][1]=820; } int main(void) { int a[][3]={ {1,2,3}, {4,5,6}, {7,8,9} }; test_fuc(a); printf("a[2][1]=%d\n",a[2][1]); return 0; }
输出:
数组当做函数参数的时候,会退化成指针,但是只退化一次,int b[][3]作为参数会变成(*b)[3];b是一个指针,指向一个数组,数组含有3个int类型的元素。++b之后,注意我们b的类型,一旦移动一个步长,相当于移动3个int位置,所以++b之后,b指向的是a[1][0];然后b[1][1];相当于b又移动了1个步长,即移动3个int位相当于对应a[2]了,在b[1]的基础上,再使用[1],相当于对应a[2][1];所以最后打印a[2][1]等价于b[1][1].
平时我们习惯使用[]这样的下标运算代替指针运算,但是我们要清楚一个道理,b[1][1]等价于*(*(b+1)+1).
欢迎加入作者的小圈子
扫描下方左边二维码加入QQ交流群,扫描下方右边二维码关注个人微信公众号并获取更多隐藏干货,QQ交流群:816747642 微信公众号:Crystal软件学堂
作者:Crystal软件学堂 bilibili视频教程地址:https://space.bilibili.com/5782182 本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在转载文章页面给出原文连接。 如果你觉得文章对你有所帮助,烦请点个推荐,你的支持是我更文的动力。 文中若有错误,请您务必指出,感谢给予我建议并让我提高的你。 |