指针与多维数组
缘起
指针和多维数组这块有点绕,单独写个笔记
多维数组中的数组名
给出一个二维数组
1 | int zippo[4][2]= |
有下列等式成立
1 | zippo == &zippo[0] |
数组名是其首元素的地址,所以前两条很容易得到
那么在加上解引用符号*
,就可以得到下面的两个式子。
解引用两次才能得到原始值,这被称为双重间接
指向多维数组的指针
1 | int (*pz)[2]; |
考虑一下,有什么区别?
pz
指向一个内含两个 int 类型值的数组
,是一个指针
pax
是一个内含两个指针的数组
,每个元素都是指向 int 类型型的指针
为什么?
由于()
的存在,pz 首先与*
结合,因此声明的是一个指向数组(内含两个 int 型元素)的指针
由于[]
优先级更高,先与 pax 结合,从而声明了一个数组
,随后*
又表示数组内的元素是指针
举个例子
1 |
|
例中声明一个p
指针,指向一个包含 5 个元素的数组,并在初始化时指向二维数组中的第一个数组(数组名就是首元素地址)
此时p
值为{1,2,3,4,5}
的地址
第一次解引用的对象是指针p
,也就是{1,2,3,4,5}的地址,得到了其值(
1`的地址)
第二次解引用的对象指针{1,2,3,4,5}
,也就是是1
的地址,得到了其值,即为1
一般而言,指向多维数组的指针如下进行声明
1 |
|
如果是作为函数的形参,则有两种写法
1 | int func( int (*p1)[2][3][4][5] ) // 需要传入一个指向五维数组的指针 |