指针和多位数组有啥关系嘞?
我们先定义一个数组:
int array[4][3];
我们知道数组名是该数组的首元素的地址,array[0][0] 是一个内含两个 int 型的数组,所以array 是这个内含两个 int 值的数组的地址;
则 array = &array[0], 也即 array = &array[0][0]。
那么 array 和 array[0] 有啥区别呢?
- array 占用了两个 int 大小对象的地址,而 array[0] 占用了一个 int 大小对象的地址;
- 解引用一个指针,从而得到引用对象代表的值,*(array[0]) 表示存储在array[0][0] 地址上的值,而 *array 等价于 &array[0][0], 而**array 等价于 *&array[0][0] 等价于 array[0][0], 也就是说 array 是地址的地址,必须解引两次才能得到对应地址上的值。地址的地址,指针的指针就是双重间接的例子;
指针如何指向多维数组呢?
int (*p) [2]; //p指向一个内含两个 int 型的数组
int *p [2]; //p指向一个内含两个指针元素的数组,每个元素都指向 int 的指针
因为" [ ] "的优先级高于 " * ",所以第一种表达符合要求。