对于一些复杂的定义,有时候很难判断到底定义的是指针还是数组甚至是函数,对于这些定义可以用下面的办法来解决
第一步:确定它的属性(通过优先级来判断)
例: int (*p)[4] //()的优先级高于[],
//因此p与()结合,
//即(*p),很明显这是一个指针
int *p[4] // *的优先级小于[],
// 因此p与[]结合
//即怕p[4],很明显这是一个数组
int (*p)() //两个()优先级相同,那么从左到右按顺序运算
//即(*p),这是一个指针
int *p() //()优先级高于*
//p(),这是一个函数
第二步:如果是指针,则考虑指针指向的内容。
如果是数组,则考虑数组的数据类型和数组长度。
如果是函数,则考虑函数的参数列表和返回值
例:int (*p)[4] //前面提到这是一个指针
//则考虑指向的内容
//很明显指针指向的是数组
//即指向数组的指针(数组指针)
int *p[4] //数组
//考虑数据类型和大小
//数据类型:int 大小:4
//即存储int型指针的数组(指针数组)
int (*p)() //指针
//考虑指向的内容
//指向的是函数,函数无形参,返回值为int型
//即指向函数的指针(函数指针)
int *p() //函数
//考虑参数列表和返回值
//参数列表:无形参 返回值:int型指针
//即返回int型指针的函数(指针函数)
对于更复杂的定义都可按照此方法按步骤解决,可根据运算符优先级先对表达式进行划分再做判断