提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
前言
二维数组 (&arr+1) 与 *(arr+1)的区别
一、函数
下面展示一些 内联代码片
。
int arr[2][5] = {1,2,3,4,5,6,7,8,9,10};
int * pr1 = (int *)(&arr+1);
int *pr2 = (int *)(*(arr+1));
printf("%d\n",*(pr1-1));
printf("%d\n",*(pr2-1));
答案:10
5
二、解释
&arr 就是获取arr数组的地址,&arr+1相当于跳过了arr[2][5]这个二维数组,此时pr1指向数据元素10 后面的这个地址。这里很多人会认为&arr+1 指向的是数组的第二个元素,其实不是的,要注意。
arr 代表的是arr[2][5]这个二维数组的首元素地址。二维数组在我看来可以看成 “行”个元素(就是有多少行就有多少个元素),只不过每行里还有“列”个元素。这里行为2,列为5。所以arr+1 为第二行的地址 (不是第二个元素的地址),*(arr+1)指向的就是第六个元素‘6’的地址。
我们解引用就可以找到*(&pr1-1 ) *(pr2-1)对应的数据为10 和 5
总结
以上就是此次二维数组一些解引用存在的误区。arr为首元素地址,&arr为数组地址,数组地址加减就不是里面的指向元素的加减了。首元素地址加减可以理解为数组里面指向元素的加减,但是多维数组来说是首元素加减为第一维度地址的加减。