C语言学习笔记(6):如何从变量声明的表面上来区分指针数组和数组指针
举例:
int *p[5]是指针数组
int (*p)[5]是数组指针
区分两者只要看变量名p周围的修饰符即可。
这里要明确两点:
1、不论int *p[5]还是int (*p)[5]都不应该看成一个整体,而应该看成一些修饰符来修饰变量p,从而使p得到准确定义;
2、[]的优先级要比*高。相同优先级修饰符,采取从左向右的编译方式。
*p[5]由于[]优先级高所以[]先修饰变量名p,所以p是一个数组名,然后再看其它修饰符,可以发现是一个int * 类型的数组,即p为指针数组。
(*P)[5]由于()和[]两者优先级相同,所以从左向右编译,那么*先修饰p,所以p是一个指针变量,然后再看周围的其它修饰符,可以发现p为一个int数组指针。
对于变量申明时的修饰,还有很多讲究,例如:
const int p与int const p 是一回事,都是表示一个int类型常量
const int *p可以看到从左向右修饰为:int类型常量的指针,const修饰的是int类型,然后*p表示p是一个指针,所以p是指向常量的指针,p本身的值是可变的。
const int * const p去掉两个const可以看到就是声明一个int指针,然后有两个修饰符,一个用于限定int(即指针所指向的类型),一个限定变量p本身,所以p是一个本身值不可变的指针,指向的值也必须是不可变的。
const int const * const p依旧是一个int指针,第二个const修饰*显然没有任何意义,所以统上面的声明实际上完全一致。
浙公网安备 33010602011771号