乐趣区

快速区分指针数组和数组指针

引言

指针数组:元素为指针的数组 int*p[5];
数组指针:指向数组的指针 int(*p)[5];
接下来从名称和 C 语言定义两方面来说一说。

名称

指针数组是一个数组,数组指针是一个指针。也就是以后面的宾语决定。
类比:

  红苹果  是一个苹果
  苹果红  是一种颜色

C 语言定义

int*p[5];
[]优先级高于 *, 所以先是 p[5]被定义为一个数组,int* 再定义数组 p[5](包括数组中所有元素)为指针。此时 p 仍和 [5] 以数组 p[5]的形式存在,只是这个数组的元素成为了指针。

int(*p)[5];
()优先级高于 *,(*p)定义为一个指针,我们把 * p 看成一个整体,用 a 代替,变为 int a[5]; 可以看出这就是一个普通数组的定义。只不过指向数组地址的 a 变成了 *p, 也就是说 p 是二级指针,它的值 *p=a,a 是一个地址,指向数组。

死记硬背

到底是指针还是数组,p 是主角(就他一个数据量,定义来定义去,也就是定义它),看它先和谁定义。在 int*p[5]; 中,p 先和 [] 结合定义,那么它就是数组,什么数组?指针数组。

延伸

其实指针和数组,从某种本质看是一样的,他们都是地址。
比如定义一个 int*a; 这是定义了一个整数指针 a,也就是定义了一个地址 a。而 int b[6]; 是定义了一个长度为 6 的整数数组,怎么表示这个数组呢?用 b 表示数组中第一个元素的地址代表整个数组,int b[6]; 的实质是定义了一个地址 b。

无论指针定义还是数组定义,都是定义了一个或几个地址,总归都是地址。

退出移动版