数组指针定义:指向数组的指针,比如int a[3][3],他的数组指针可以是int (*p)[3]

指针数组定义:由指针构成的数组,比如int *p[3],表示由3个int*类型构成的数组。

对于数组指针,了解数组指针对我们理解取出数组的元素会更加深刻。

对于一维数组,我们知道int a[3],int*p=a;p是int*类型的,同时数组名出现在表达式中,会转化成指向第一个元素的地址,这样a也是int*类型的,那*a就是把a所在地址的数取出。

那在二维数组是不是这样呢?

数组指针与数组_指针数组

a+1比a打印多12,通过观察我们猜测这个地址应该是元素4的地址。但是我们在使用*时发现打印了一些乱七八糟的数,这是什么?

首先a是ine(*)[3]类型,那解引用就应该是**,首先*把int(*)[3]改成int[3],然后*就可以取出int[3]的值了,我们试试看。

数组指针与数组_数组指针_02

这样好像就可以了。然后我们通过观察,会发现**(a+1)就是a[1][0],而*(*a+1)就是

a[0][1]。

对于多维数组,是不是也是这样呢?

数组指针与数组_数组名_03

可以看出,***a对应的是a[0][0][0],***(a+1)对应的是a[1][0][0],

**(*a+1)对应的是a[0][1][0],*(**a+1)对应的是a[0][0][1]。

数组指针与数组_数组名_04

我们使用循环就可以把数组的元素一次打印出来(注意for的对应)

接下来我们使用数组指针:

数组指针与数组_一维数组_05

好像就是a[i]=*(a+i)这个意思。

由此得出一个概念:数组名出现在表达式中,会退化成下一级的数组指针类型。

int a[3][3],a是(*)[3]类型;int a[3][3][3],a是int(*)[3][3]类型。

数组指针与数组_数组名_06

说白了,这篇文章就是让你明白两个问题:

1.数组名出现在表达式中,代表什么意思?

2.数组名类型时怎么样的,或者说用数组指针如何表示?


如有不对,欢迎指正。​