Chinaunix首页 | 论坛 | 博客
  • 博客访问: 249040
  • 博文数量: 12
  • 博客积分: 2500
  • 博客等级: 少校
  • 技术积分: 630
  • 用 户 组: 普通用户
  • 注册时间: 2006-03-13 16:17
文章分类
文章存档

2011年(1)

2008年(11)

我的朋友

分类: 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,我们成功解析!这里,我们也明白了“函数指针”的意思就是“它是一个指针,这个指针指向一个函数”。

阅读(1750) | 评论(0) | 转发(1) |
给主人留下些什么吧!~~