数组指针本质上是一个指针,但这个指针指向的是一个数组
指针数组本质上是一个数组,但这个数组里存放的都是指针
常量指针本质上是一个指针,但这个指针指向一个常量
指针常量本质上是一个常量,但这个常量是一个指针
从编译原理角度来看,优先级和右结合让我不再迷茫,[]优先级高于*
,编译器读int *p[]的时候,先让[]与p进行左结合,然后再与结合,然后再与int结合,也就是说p首先被确定是一个数组,然后该数组中的元素都是int *类型的。
而int (*
p)[],则表明p首先是一个指针了,指向的类型是一个int
明确一个优先级顺序:()>[]>*,所以:
(*p)[n]:根据优先级,先看括号内,则p是一个指针,这个指针指向一个一维数组,数组长度为n,这是“数组的指针”,即数组指针;
*p[n]:根据优先级,先看[],则p是一个数组,再结合*,这个数组的元素是指针类型,共n个元素,这是“指针的数组”,即指针数组。
int *p[]; //指针数组,指针型数组,是一个数组,类型为*
int (*p)[]; //数组指针,数组型的指针,是一个指针,指向一个int []数组
const int p; // p 为常量,初始化后不可更改
const int* p; // *p 为常量,不能通过*p改变它指向的内容
int const* p; // *p 为常量,同上
int* const p; // p 为常量,初始化后不能再指向其它内容