2021-04-14

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


前言

二维数组 (&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为数组地址,数组地址加减就不是里面的指向元素的加减了。首元素地址加减可以理解为数组里面指向元素的加减,但是多维数组来说是首元素加减为第一维度地址的加减。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值