二维数组a[M][N]的数组名 a 表示的是谁的地址?
在一维数组中,数组名表示的是数组第一个元素的地址,那么二维数组呢?
a表示的是元素a[0][0]的地址?不是!
我们说过,二维数组就是一维数组
二维数组a[3][4]就有三个元素,
所以数组a的第一个元素不是a[0][0],而是a[0]的地址,
即:
a == &a[0];
而a[0]又是a[0][0]的地址,即:
a = &(&a[0][0])
即二维数组名 a 就是地址的地址,必须两次取值才可以取出数组中存储的数据。对于二维数组a[M][N],数组名a 的类型为 int(*)[N],所以如果定义了一个指针变量 p:
int *p;
并希望这个指针变量指向二维数组 a,那么不能把 a 赋值给 p,因为他们的类型不一样,要么把 &a[0][0]赋值给 p,要么把 *a 赋值给 p,前两个好解释,可为什么可以把 *a赋值给 p呢?
因为 a == &(&a[0][0]),所以 *a == *(&(&a[0][0])) == &[0][0]
除此之外你可以把指针变量 p 定义为int(*)[N]型,这个时候就可以把 a 赋值给 p,而且用你这种方法的人比较多,但是我不太喜欢。
如果将二维数组名 a 赋值给指针变量 p:则有:
p =