要理解一个声明,必须懂得其中的优先级规则
优先级规则:
A 从声明的最左边开始向右寻找,直到找到第一个标识符,然后按照下面的优先级顺序依次读取
B 优先级顺序从高到低依次是:
B.1 声明中被括号括起来的那部分(标识符包含在括号中)当成一个整体,先处理括号内的
B.2 后缀操作符:
圆括号():表示这是一个函数
方括号[]:表示这是一个数组
B.3 前缀操作符:
星号*:表示“指向...的指针”
C 如果const和(或)volatile关键字的后面紧跟着类型说明符(如int、long等),那么它作用于类型说明符。在其他情况下,const和(或)volatile关键字作用于它左边紧邻的指针星号。此外,const在类型说明符前或类型说明后是一样的
示例1:
char * const *(*next)()
将上述分析结果加以概括,这个声明表示“next是一个指针,它指向一个函数,该函数返回另一个指针,返回的指针指向一个类型为char的只读指针”
示例2:
char *(* c[10])(int **p)
从最左边开始向右寻找,直到找到第一个标识符c,c是一个数组,它的元素类型是函数指针,其所指向的函数返回一个char型的指针。在数组中被函数指针所指向的所有函数都把一个指向指针的指针作为它们的唯一参数
示例3:
char * const src
src是指向char型的只读指针
char const *src
src是指向只读char的指针
容易造成混乱的是char const *src和const char *src的意思完全相同
参考:
1、《C专家编程》
2、《征服C指针》