它们的数据类型如下:
以a[2][3]举例
&a | int (*)[2][3] |
a | int (*)[3] |
&a[0] | int (*)[3] |
a[0] | int * |
&a[0][0] | int * |
a[0][0] | int |
&a中的a代表整个二维数组对象
二维数组名a是常量指针(指向常量地址的指针变量),指向a[0]这个一维数组
那么一维数组名a[0],指向a[0][0]这个int型数据
在做一些运算的时候,数组名总是和&数组名[0]等价,等价是指数值和类型均相等
如:
a=&a[0]
a[0]=&a[0][0](此时a[0]变成一维数组名)
那么,也就是说:
n维数组a,数组名a指向a[0],a[0]是n-1维数组,数组名a[0]指向a[0][0],a[0][0]是n-2维数组,。。。。。。
根据上面说的来做指针的加减运算就比较清晰了。
另分析这种二维数组的写法:
int**a;
a = new int*[2];
//a为指针,指向具有2个int*数据的数组(即元素均为指针的数组)
for(int i=0;i<2;i++)
*(a+i) = new int[3];
// 分配2批动态空间(每批为3个int大小),并使上述数组元素指针指向它们。此时的a与2行3列的数组相似,
//也可通过a[i][j]的形式访问各元素。
它们的数据类型分析:
&a | int *** |
a | int ** |
&a[0] | int ** |
a[0] | int * |
&a[0][0] | int * |
a[0][0] | int |
此时a只是普通的双指针变量,取地址就多加一层指针,
a[i]=*(a+i),代表取a+i这个地址里的内容(int*)
a[i][j]=*(*(a+i)+j),代表取a+i这个地址里的内容(int*)+j,再去取 *(a+i)+j这个地址里的内容(int)
同样满足 数组名总是和&数组名[0]等价