int a[][4] = {1,2,3,4,5,6,7,8,9,10,11,12}
总结
先总结一下:对于上面定义的的二维数组,他们与指针有着这样的关系
等价于 | 解释 | |
a | int型二维数组 | 代表变量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};
等价 | 解释 | |
b | int型一维数组 | 变量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