深入解析C语言声明

如果说C语言声明很简单的人不是牛人就是还没入门。本文来讲解C语言的声明的一些基本内容,很多内容参考《c专家编程》。首先由一个最简单的问题引入,你知道 int * p[5] 和 int (*p)[5] 的区别在哪里吗?把后面的答案遮到,想想。也许你知道反正一个是含有五个指向整型的指针元素的指针数组,另一个是指向一个拥有5个整型元素的数组的指针,具体呢?

int *p[5]是一个含有五个整型指针的数组,int(*p)[5]是一个指向5个整型元素的数组指针。如果你能分清楚,恭喜你,你起码是入门级以上的水平。那这个呢, char * const *(*next)()?

 

如果你能把上面这句声明清清楚楚明明白白的说出来,下面你不用看了,下面的东西对你来说都是废话。

 

首先我们需要理解C语言的声明的优先级规则,如下:

A 声明从它的名字开始读取,然后按照优先级顺序来依次读取。

B 优先级从高到底依次是:

B.1 生命中被括号括起来的那部分

B.2 后缀操作符

括号()表示这是一个函数,而方括号[]表示这是一个数组

B.3  前缀操作符: 星号*表示 指向...的指针

C 如果const在指针星号前他作用于指针指向的变量,如果const在指针星号后他作用于指针

另一种说法是,const修饰的是它前面的类型,如果它前面没有类型则修饰的是紧跟其后的类型

如 const int * a; int const * a; int * const a;前两个const在*之前,指针所指向的变量是只读,最后一个是指针本身只读。

 

我们开始解析上面的声明

适用规则 解释

A 首先,看变量名"next",并注意到它直接被括号所括住

B.1 所以先把括号里面的东西作为一个整体,得出"next是一个指向...的指针"

B 然后考虑括号外面的东西,在星号前缀和括号后缀之间做出选择

B.2 规则告诉我们优先级较高的是右边的函数括号,所以得出"next是一个函数指针,指向一个返回...的函数" 

B.3 然后,处理前缀"*",得出指针所指的内容

C 最后,把"char * const"解释为指向字符的常量指针

 

所以综上所述,这个式子的真正的含义是:next是一个指针,它指向一个函数,该函数返回另一个指针,该指针指向一个类型为char的常量指针。

 

 

其实理解这个最基本的优先级是需要理解的运算符的优先级:如下顺序

操作符 结合性

() [] -> . 左到右

! - ++ -- + - * & sizeof 右到左

* / % 左到右

+ - 左到右

<< >> 左到右

< <= > >= 左到右

== != 左到右

& 左到右

^ 左到右

| 左到右

&& 左到右

|| 左到右

?: 右到左

= += -= *=  /= %= ^= |= <<= >>=  到左

, 左到右

你可能感兴趣的:(编程,c,语言)