[C语言低能儿]C语言的声明规则
最近在拜读《C专家编程》,发现自己果然是C语言低能儿,于是准备写点东西记录一下,以便于自己以后查找。
优先级规则
以下摘自《C专家编程》
- A.声明从它的名字开始读取,然后按照优先级顺序依次读取
- B.优先级从高到低:
- B.1声明中被括号括起来的那部分
- B.2后缀操作符:()表示是一个函数,[]表示是个数组
- B.3前缀操作符:星号*表示 指向..的指针
- C.如果const和(或)volatile关键字的后面紧跟类型说明符(如int,long等),那么它作用于类型说明符。在其他情况下,const和(或)volatile关键字作用于它左边紧邻的指针星号
下图是从《C专家编程》里面抄过来的
我们用书中的一个例子来验证,看如下声明:
char * const *(*next)();
下面是分析:
适用规则 | 解释 |
---|---|
A | 首先,我们知道了变量名next |
B.1 | 将括号里面的东西作为一个整体,得出"next是一个指向...的指针" |
B | 走出括号,在星号前缀和括号后缀之间做出选择 |
B.2 | 优先级高的是函数括号,所以得到next是一个指向函数的指针,指向一个返回...的函数 |
B.3 | 处理前缀*,得出指针所指的内容 |
C | 把"char * const"解释为指向字符的常量指针 |
那么对这个变量的最终解释就是:"next是一个指针,它指向一个函数,该函数返回另一个指针,该指针指向一个类型为char的常量指针"
如果不熟悉C语言的声明规则的话第一遍这样走下来还是很绕的
下面是书中另一个例子:
char *(* c[10])(int **p);
这是对这个变量的解释:"c是一个数组,他的元素类型是指向函数的指针,函数的返回值是指向char的指针"