C专家编程-分析C语言的声明

1 理解C语言声明的优先级规则

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

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

   1 声明中被括号括起来的那部分

   2 后缀操作符:括号() 表示这是一个函数,而方括号[] 表示这是一个数组。

   3 前缀操作符:星号* 表示“指向…的指针”

C 如果const 和(或)volatile 关键字的后面紧跟类型说明符(如int,long等),它作用于类型说明符。在其他情况下,const 和(或)volatile 关键字作用于它左边紧邻的指针星号。

2 用优先级分析C语言声明一例

char * const * (*next) ();

表1.1 用优先级规则解决一个声明

适用规则

解释

A 首先,看变量名"next”,并注意到它直接被括号所括住
B.1 所以先把括号里的东西作为一个整体,得出"next“是一个指向…的指针
B 然后考虑括号外面的东西,在星号前缀和括号后缀之间做出选择
B.2 B.2规则告诉我们优先级较高的是右边的函数括号,所以得出"next”是一个函数指针,指向一个返回…的函数
B.3 然后,处理前缀"*",得出指针所指的内容
C 最后,把"char * const” 解释为指向字符的常量指针

    把上述分析结果加以概括,这个声明表示"next” 是一个指针,它指向一个函数,该函数返回另一个指针,该指针指向一个类型为char 的常量指针。

3 typedef int x[10] 和define x int [10]的区别

typedef 为数据类型创建别名,而不是创建新的类型。

在typedef 和宏文本替换之间存在一个关键性的区别。正确思考这个问题的方法就是把typedef 看成一种彻底的“封装”类型----在声明它之后不能再往里面增加别的东西。


typedef和宏的区别:

首先,可以用其他类型说明符对宏类型名进行扩展,但对typedef 所定义的类型名却不能这样做。

#define peach int
unsigned peach i; // 没问题
typedef int banana;
unsigned banana i; // 错误!
其次,在连续几个变量的声明中,用typedef 定义的类型能够保证声明中所有的变量均为同一种类型,二用#define 定义的类型则无法保证。
 #define int_ptr int *
 int_ptr chalk, cheese;
 经过宏扩展,第二行变为:
 int *chalk, cheese;
 这使得chalk 和cheese 成为不同的类型,chalk是一个只想int 的指针,而cheese则是一个int。
 typedef char * char_ptr;
 char_ptr Bentley, Rolls_Royce;
 Bentley和Rolls_Royce的类型依然相同,都是只想char的指针。

你可能感兴趣的:(C专家编程-分析C语言的声明)