二维数组及数组指针的理解笔记
二维数组名的本质是数组指针,数组名本身就是一个指针,所以我暂且理解二维数组名相当于一个二级指针,
(数组名作为指针使用时不能做为左值 lvalue使用)
#include <stdio.h>
#include <stdlib.h>
//二维数组名是指向行的,“&二维数组名”就指向了整个二维数组。
//二维数组名[i]" 是指向i行的首元素的。“&二维数组名[i]”就指向了一行。
int main()
{
int Array[2][5] = {
{0,1,2,3,4},
{5,6,7,8,9},
};
int (*pArray)[5] = Array; //定义一个数组指针并指向二维数组
void * pVoid = NULL;
//Array[0] 是第0行的5个元素的首地址
//以下结果相同
printf("Array[0] = 0x%p\n",Array[0]);
printf("*Array = 0x%p\n",*Array);
printf("&Array[0][0] = 0x%p\n",&Array[0][0]);
//Array[1] 是第1行的5个元素的首地址 *Array[1] = 5
//*(Array+1) 等价于 Array[1] 相当里面存的第1行第1个元素的地址,
//以下结果相同
printf("Array[1] = 0x%p\n",Array[1]);
printf("*(Array+1) = 0x%p\n",*(Array+1));
printf("&Array[1][0] = 0x%p\n",&Array[1][0]);
//*(Array+1)存的第1行第1个元素的地址,对其在进行取值操作,就相当于取出第1行第1个元素
printf("**(Array+1) = %d\n",**(Array+1)); //结果显示5
printf("*Array[1] = %d\n",*Array[1]); //结果显示5
printf("*(Array[1]+1) = %d\n",*(Array[1]+1)); //结果显示6
printf("*(*(Array+1)+2) = %d\n",*(*(Array+1)+2)); //结果显示7
printf("*(*(pArray+1)+2)= %d\n",*(*(pArray+1)+2));//结果显示7
system("pause");
return 0;
}
如下图
0x0060FED0 - 0x0060FEBC = 0x14 = 20
Array和Array+1相差45 = 20个字节,一个int占4个字节
同样pArray和pArray+1亦然
45 = 20个字节,一个int占4个字节
同样pArray和pArray+1亦然