全部博文(12)
分类: C/C++
2008-03-21 22:48:03
这样的C语言声明是不是很令人头疼:
(1) char * const * (* next) ();
(2) void (*signal (int sig, void (*func)(int)))(int);
它们是什么含义,如何能正确的理解这些复杂的声明?
下面的方法非常的简洁,按照它的步骤,你就很容易得到正确的答案。
理解C语言声明的优先级规则
A 声明从它的名字(如上例的next, signal)开始读取,然后按照优先级顺序依次读取。
B 优先级从高到低依次是:
B.1 声明中被括号括起来的那部分
B.2 后缀操作符:
括号( )表示这是一个函数,而方括号[ ]表示这是一个数组
B.3 前缀操作符:星号*表示“指向…的指针”
C 如果const和(或)volatile关键字的后面紧跟类型说明符(如int, long等),那么它作用于类型说明符。在其他情况下,const和(或)volatile关键字作用于它左边紧邻的指针星号。
按照上述的规则,我们解析例(1):
next是一个指针;
它指向一个函数;
该函数的返回值是一个指针,这个指针指向另一个类型为char的常量指针。
同样,我们解析例(2):
signal是一个函数;
它有两个形参:第一个是int类型的sig;第二个是一个指针,这个指针指向一个函数,这个函数有一个int类型的参数,返回值为void类型;
signal函数的返回值是一个指针:这个指针指向一个函数,这个函数有一个int类型的参数,返回值为void类型。
Ok,我们成功解析!这里,我们也明白了“函数指针”的意思就是“它是一个指针,这个指针指向一个函数”。