深入解析C语言声明

来源:互联网 发布:mac 8080端口被占用 编辑:程序博客网 时间:2024/05/18 17:24

如果说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右到左

* / %左到右

+ -左到右

<< >>左到右

< <= > >=左到右

== !=左到右

&左到右

^左到右

|左到右

&&左到右

||左到右

?:右到左

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

,左到右

原创粉丝点击