缘起
指针和多维数组这块有点绕,单独写个笔记
多维数组中的数组名
给出一个二维数组
1 2 3 4 5 6 7
| int zippo[4][2]= { {1,3}, {2,3}, {2342,34}, {242,234} };
|
有下列等式成立
1 2 3 4 5
| zippo == &zippo[0] zippo[0] == &zippo[0][0]
*zippo == &zippo[0][0] **zippo == zippo[0][0]
|
数组名是其首元素的地址,所以前两条很容易得到
那么在加上解引用符号*,就可以得到下面的两个式子。
解引用两次才能得到原始值,这被称为双重间接
指向多维数组的指针
1 2
| int (*pz)[2]; int * pax[2];
|
考虑一下,有什么区别?
pz指向一个内含两个 int 类型值的数组,是一个指针
pax是一个内含两个指针的数组,每个元素都是指向 int 类型型的指针
为什么?
由于()的存在,pz 首先与*结合,因此声明的是一个指向数组(内含两个 int 型元素)的指针
由于[]优先级更高,先与 pax 结合,从而声明了一个数组,随后*又表示数组内的元素是指针
举个例子
1 2 3 4 5 6 7 8 9 10 11 12
| #include <stdio.h> int main(void) { int a[3][5] = { {1, 2, 3, 4, 5}, {6, 7, 8, 9, 10}, {11, 12, 13, 14, 15} }; int (*p)[5] = a; printf("%d",**p); }
|
例中声明一个p指针,指向一个包含 5 个元素的数组,并在初始化时指向二维数组中的第一个数组(数组名就是首元素地址)
此时p值为{1,2,3,4,5}的地址
第一次解引用的对象是指针p,也就是{1,2,3,4,5}的地址,得到了其值(1`的地址)
第二次解引用的对象指针{1,2,3,4,5},也就是是1的地址,得到了其值,即为1
一般而言,指向多维数组的指针如下进行声明
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| #include <stdio.h> int main(void) { int array[1][2][3][4][5]; array[0][0][0][0][0] = 1234; array[0][0][0][0][1] = 12345;
int(*p1)[2][3][4][5] = array; int(*p2)[3][4][5] = array[0]; int(*p3)[4][5] = array[0][0]; int(*p4)[5] = array[0][0][0]; int(*p5) = array[0][0][0][0]; printf("%d %d %d %d %d\n",*****(p1),****p2,***p3,**p4,*p5); printf("%d %d %d %d %d",*(****p1+1),*(***p2+1),*(**p3+1),*(*p4+1),*(p5+1));
}
|
如果是作为函数的形参,则有两种写法
1 2
| int func( int (*p1)[2][3][4][5] ) int func( int [][2][3][4][5] );
|