指针与多维数组

缘起

指针和多维数组这块有点绕,单独写个笔记

多维数组中的数组名

给出一个二维数组

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; // 指向五维数组 array 也就是指向array[0]的地址
int(*p2)[3][4][5] = array[0]; // 指向四维数组 array[0] 也就是指向array[0][0]的地址
int(*p3)[4][5] = array[0][0]; // 指向三维数组 array[0][0] 也就是指向array[0][0][0]的地址
int(*p4)[5] = array[0][0][0]; // 指向二维数组 array[0][0][0] 也就是指向array[0][0][0][0]的地址
int(*p5) = array[0][0][0][0]; // 指向一维数组 array[0][0][0][0] 也就是指向array[0][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));
/*
1234 1234 1234 1234 1234
12345 12345 12345 12345 12345
*/
}

如果是作为函数的形参,则有两种写法

1
2
int func( int (*p1)[2][3][4][5] ) // 需要传入一个指向五维数组的指针
int func( int [][2][3][4][5] ); // 等效写法
Author

BakaFT

Posted on

2020-07-26

Updated on

2023-12-28

Licensed under

Your browser is out-of-date!

Update your browser to view this website correctly.&npsb;Update my browser now

×