c语言的声明模型有点晦涩。比如语句
char * const *(* next)();
要解释一个声明,首先要懂得其中的优先级规则。规则如下
- 声明从它的名字开始读取,然后按照优先级顺序依次读取
- 优先级从高到低
2.1 括号声明中被括号括起来的部分2.2 后缀操作符:
括号()表示这是一个函数
方括号[]表示这是一个数组
2.3 前缀操作符
星号*表示“指向…的指针”
- 如果const关键字的后面紧跟类型说明符(如int float等),那么const作用于类型说明符。其他情况下,const关键字作用于他左边紧邻的指针星号。
例子
char * const *(* next)();
第一步:首先变量名next 注意到他被括号包住
第二步:
1. 把括号里的东西看成一个整体,得出next是指向…的指针
2. 考虑括号外面 在星号前缀和括号后缀之间选择。根据优先级2.2 优先级高的是右边的括号,所以 next是一个函数指针,指向一个返回值是…的函数
3. 处理前缀操作符。得出指针所指向的内容。
第三步: 把char * const *解释为指向字符的常量指针。
这个分析告诉我们,这个声明表示
next是一个指针,它指向一个函数,该函数返回另一个指针,该指针指向一个类型是char的常量指针。