C语言中二级指针与二维数组的对应关系详解

int a[][4] = {1,2,3,4,5,6,7,8,9,10,11,12}

总结

先总结一下:对于上面定义的的二维数组,他们与指针有着这样的关系

 等价于解释
aint型二维数组代表变量a的起始地址
a+i&a[i]代表第i行起始地址
*(a+i)a[i]第i行首元素的地址
*(a+i)+j&a[i][j]第i行第j列元素的地址
*(*(a+i)+j)a[i][j]第i行第j列元素的值

如果不好记忆理解的话我们用一维数组和一级指针类比一下

int b[] = {1,2,3,4};
 等价解释
bint型一维数组变量b的起始位置
b+i&b[i]第i个元素的地址
*(b+1)b[i]第i个元素的值

 

这样类比还不是很清楚;我们从内存模型来分析;

先看一维数组

       变量b相当于一个int*指针,他的其实位置就是b[0]的地址;

       所以b+1 相当于指针向上移动4个字节,4个字节的来源就是  步长X sizeof(int);而数组中的元素都是int型,都是占用4个字节;所以b+1刚好指向b[1];

       即b+1 =>&b[1];那么*(b+1)=>b[1];

 

接着我们再来分析二维数组;

同理a+1就是移动  步长 X sizeof(int),那么就刚好指向a[1]的起始位置;

也就是:

       a+1 => &a[1];*(a+1)=> a[1];

再往下推导就是:

       *(a+1)+2 =>& a[1][2];*(*(a+1)+2) =>&a[1][2];

当然,这只是二位数组的一种模型,还有两种模型是不是也符合了?答案是符合,这里就不再分析了,可以直接看另外两种的内存模型图链接如下https://blog.csdn.net/qq_40737025/article/details/106504282

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值