深入解析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右到左
* / %左到右
+ -左到右
<< >>左到右
< <= > >=左到右
== !=左到右
&左到右
^左到右
|左到右
&&左到右
||左到右
?:右到左
= += -= *= /= %= ^= |= <<= >>= 右到左
,左到右
- 深入解析C语言声明
- 深入解析C语言声明
- 深入解析C语言声明
- C语言声明解析
- C语言复杂声明解析
- c语言 复杂声明 解析
- C语言复杂声明解析
- 解析C语言复杂声明
- C语言声明解析方法
- C语言声明的解析
- C语言复杂声明的解析
- 解析c语言的复杂声明
- 解析c语言的复杂声明实践
- C语言中的复杂声明解析
- C语言复杂声明的解析
- c语言中复杂声明的解析
- C语言指针复杂声明解析
- c语言复杂声明的解析
- OCAF初步
- China and U.S. grapple with military mistrust
- The reference to entity "characterEncoding" must end with the ';' delimiter
- Could not read mappings from resource: hiber.hbm.xml
- 设计模式学习-Chain Of Responsiblity(责任链)
- 深入解析C语言声明
- emulator: ERROR: no search paths found in this AVD's configuration
- 在桌面應用程式中使用 WebKit (1) -雜論,以及用 Objective C 操作 DOM
- 求助啊
- 关于匹配
- jasperreports报表生成代码
- c++远程调用webservice
- SQL语句大全
- VC++动态/静态链接库 【1】