今天,看到一个很好的例子,讲解指针和高维数组:
比如声明如下:int a[4][5];
则:
&a: 表示数组的首地址
a: 类型为int (*)[5],即a为指向数组a第0个元素a[0]的指针,且a为常量,不可以进行赋值运算,a+i的类型也同为int (*)[5],指向a[i];&a+1等同于&(a+1)跳过全部20个元素,指向数组末尾的下一个。
*a或a[0]: 类型为int *,*a为指向数组a[0]首元素a[0][0]的指针;
*(a+1)或a[1]: 类型也为int *,因a的类型为int (*)[5],即a指向一个有5个元素的一维数组,故a+1将跳过5个元素。则(a+1)为指向数组a的第1个元素a[1]的指针,即*(a+1)或a[1]为指向数组a[1]首元素a[1][0]的指针
*(*(a+1)+2): 类型为int,因*(a+1)类型为int*,故*(*(a+1)+2)将跳过2个int元素。则*(*(a+1)+2)为指向数组a[1]第二个元素a[1][2]的指针,即*(*(a+1)+2)为数组a[1]的第2个元素a[1][2].
由以上总结得到:
- &a的类型为 int(*)[4][5];
- a+i的类型为 int(*)[5];
- *(a+i)的类型为int *;
- *(*(a+i)+j)的类型为int;
- *(a+i)=a[i];
- *(*(a+i)+j)=*(a[i]+j)=a[i][j]