Chinaunix首页 | 论坛 | 博客
  • 博客访问: 222465
  • 博文数量: 22
  • 博客积分: 847
  • 博客等级: 准尉
  • 技术积分: 325
  • 用 户 组: 普通用户
  • 注册时间: 2010-11-02 11:08
文章存档

2012年(9)

2011年(8)

2010年(5)

我的朋友

分类: C/C++

2010-12-19 21:05:41

首先说明函数指针的定义形式:
     <存储类型> 数据类型 (* 函数指针名) (参数表);
    其中存储类型一般不写,用默认形式。可以选auto型、static型和extern型等。数据类型是指针所指向函数返回值的数据类型。参数表是指向函数的参数表。
 
再说明一个函数的返回值是一个函数指针(可理解为此函数A实际返回的是一个指向另一个函数B的指针)的定义形式:
    <存储类型> 数据类型 (* 函数名(参数表1))(参数表2);
    其中存储类型是函数的存储类型,可选。如上所述。
    数据类型是此函数返回的函数指针的返回值的数据类型(此处可理解另一个函数B的返回值的数据类型)。
    (* )星号表示此函数A返回的是一个指针,即返回的是一个函数指针B。
    函数名(参数表1),函数名是此函数A的函数名称,参数表1是函数A的参数表。
    (参数表2),表示返回的函数指针(函数B)的参数表。
 
由上,我们可以再来看看signal的定义原型:
    #include
    void (* signal (int signo, void (*func) (int) )) (int );
      由于上面所讲的,可以看出signal的定义是与一个函数的返回值是一个函数指针的定义是类似的。我们可以采用分而治之的方法来分解这个函数。 
 首先,可以先看看函数参数表的说明。int signo, void (*func) (int) ,即红色字的部分。从这个部分,我们可以看到,signal有两个参数,第一个是个整型的数int;第二个参数是void (*func) (int),按照上面函数指针的定义,可以知道第二个参数其实是一个函数指针。它的返回类型是void,函数指针名是func,返回参数是int。
    忽略参数表,用..代替之后,可以写为:void (* signal (...)) (int );于是可以很清楚地看到这是一个返回函数指针的函数。这个函数名是signal,参数是...,返回的是一个指针,指向带有一个int型参数,返回值是void的函数。
   
    实际,按照man手册,可以看到,signal返回的值是指向信号signo前一次有效动作的指针,因此它的原型是和func相同的,即返回void空,有一个int的参数。
阅读(2731) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~