#include <stdio.h>
int main()
{
int a[2][3];
/*
* &a
* int (*)[2][3]
* 数组的地址
*/
int (*p1)[2][3] = &a;
printf("%p\t%p\n", p1, p1+1);
/*
* a
* int (*)[3]
* 数组第0行的地址 (a = &a[0])
*/
int (*p2)[3] = a;
printf("%p\t%p\n", p2, p2+1);
/*
* &a[0]
* int (*)[3]
* 数组第0行的地址
*/
int (*p3)[3] = &a[0];
printf("%p\t%p\n", p3, p3+1);
/*
* a[0]
* int *
* 数组第0行第0列元素的地址 (a[0] = &a[0][0])
*/
int *p4 = a[0];
printf("%p\t%p\n", p4, p4+1);
/*
* &a[0][0]
* int *
* 数组第0行第0列元素的地址
*/
int *p5 = &a[0][0];
printf("%p\t%p\n", p5, p5+1);
/*
* a[0][0];
* int
* 数组第0行第0列元素的值
*/
int val = a[0][0];
printf("%d\n", val);
return 0;
}
以a[2][3]
为例:
符号元素 | 含义 | 数据类型 |
---|---|---|
&a | 数组的地址 | int (*)[2][3] |
a | 数组第0行的地址 | int (*)[3] |
&a[0] | 数组第0行的地址 | Int (*)[3] |
a[0] | 数组第0行第0列元素的地址 | int * |
&a[0][0] | 数组第0行第0列元素的地址 | int * |
a[0][0] | 数组第0行第0列元素的值 | int |
那么如何理解这些符号元素的含义呢?以下是我的理解:
前置知识:我们知道数组的变量名表示数组首元素的地址。
在一维数组int a[10]
中,a
是int *
类型的指针常量,无法修改a
的指向,可以修改a指向的内容。
a
的内容是a[0]
元素的地址a = &a[0]
在n
维数组a
中,同样a
是数组首元素的地址,a
数组首元素的地址是&a[0]
,于是a
指向a[0]
;
a[0]
指向n-1
维,而a[0]
数组首元素的地址是&a[0][0]
,于是a[0]
指向a[0][0]
;
a[0][0]
指向n-2
维,而a[0][0]
数组首元素的地址是&a[0][0][0]
,于是a[0][0]
指向a[0][0][0]
;
…
依次迭代下去便是多维数组的逻辑。
所以在二维数组a[2][3]
中,a
表示a
数组首元素的地址,也就是&a[0]
,所以a
指向a[0]
,而a[0]
是一维数组,所以a
是指向一维数组的指针,故a
的数据类型是int (*)[3]
;
同样a[0]
表示a[0]
数组首元素的地址,也就是&a[0][0]
,所以a
指向a[0][0]
,而a[0][0]
是int类型的变量,所以a[0]
是指向int类型数据的指针,故a[0]
的数据类型是int *
类型。
其他的符号元素也就容易理解了,这里不再详细解释。