不同价位的精美音乐盒 健身减肥瘦身产品 时尚、运动服饰女鞋围巾配件

2008年8月23日星期六

C语言中声明的分析与理解

我们以这样的一个问题来开始我们的讨论:你明白下面的声明的确切意思吗?

char * const *(*next) ( );

其实还有很多比上面这个更复杂的声明形式,这里我们只是列出了其中的一种。如果你天生是个C语言的天才或专家,或许你能够一眼看出它的含义。但是大多数的程序员、学生和教师面对上述问题时,往往都会被C语言恐怖的声明方法所折磨。

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

采用上面介绍的优先级规则来分析本文开始所提出的问题。下面描述每一步所应用的规则及其相应的解释。
A 首先看变量名"next",并注意到其被括号括住
B.1 所以先把括号里的东西作为一个整体,得出“next是一个指向…的指针”
B 然后考虑括号外面的东西,在星号前缀和括号后缀之间做出选择
B.2 根据B.2, 右边的括号的优先级较高,所以得出“next是一个函数指针,指向一个返回…的函数”
B.3 接着处理前缀“*”,得出指针所指的内容
C 最后把" char * const"解释为指向字符的常量指针

综合上面的各步分析,我们可以把本文开始的声明用概念清晰的语言表示为:next是一个指针,它指向一个函数,该函数返回另一个指针,该指针指向一个类型为 char 的常量指针。

好了,你现在掌握了C语言中声明的分析方法了吗?

掌握了? 好,试试一个更复杂的例子吧: char *(* c[10]) (int **p);

你可以在下面回复提交你的答案哦,呵呵