引言
指针数组:元素为指针的数组 int*p[5];
数组指针:指向数组的指针 int(*p)[5];
接下来从名称和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表示数组中第一个元素的地址来代表整个数组,实质是定义了一个地址b。
无论指针定义还是数组定义,都是定义了一个或几个地址,总归都是地址。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。