[C语言低能儿]C语言的声明规则

最近在拜读《C专家编程》,发现自己果然是C语言低能儿,于是准备写点东西记录一下,以便于自己以后查找。

优先级规则

以下摘自《C专家编程》

  • A.声明从它的名字开始读取,然后按照优先级顺序依次读取
  • B.优先级从高到低:
    • B.1声明中被括号括起来的那部分
    • B.2后缀操作符:()表示是一个函数,[]表示是个数组
    • B.3前缀操作符:星号*表示 指向..的指针
  • C.如果const和(或)volatile关键字的后面紧跟类型说明符(如int,long等),那么它作用于类型说明符。在其他情况下,const和(或)volatile关键字作用于它左边紧邻的指针星号

下图是从《C专家编程》里面抄过来的
image

我们用书中的一个例子来验证,看如下声明:

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的指针"

posted @ 2022-02-13 12:17  Foriver  阅读(167)  评论(0编辑  收藏  举报