• void (*f(int, void (*)(int)))(int) 函数解析


     

    函数指针

     

    今天与几个同学看到了一个函数指针定义:

     

    void (*f(int, void (*)(int)))(int)

     

    曾经在C trap pit fails里面见过,可是文章里面介绍的非常具体,可是往往使刚開始学习的人抓不到重点, 结果弄的一头污水。这里就简介一下这中函数指针的定义方法。

     

    什么是函数指针?

     

    这个问题从定义的角度来看非常好理解,指向函数的指针就是函数指针,可是我们怎样声明一个函数指针呢?又怎样将一个地址强制转换为某一个类型的函数指针呢?这里看以下一个样例源代码:

    void function(int a)

    {

           a = 5;

    }

    void (*pfunc)(int);

     

    非常easy,上面这段代码声明了一个函数fucntion和一个函数指针pfunc, 它指向的函数就是一个具有void返回值,int參数的函数。假设将function函数的地址给pfunc指针,能够简单的通过以下两种赋值:

           pfunc = function;

    或者

           pfunc = &function

    通过指针调用该函数,也有两种方法:

           pfunc(5); (*pfunc)(5);

    我们看一下赋值语句,pfunc = function; 但有时候可能是一个常数0x8999940, 它恰好也表示一个安全的与function同样的函数,怎样将这个数值赋给pfunc呢?显然我们须要强制类型转换,应该将该常数转换成什么类型呢?这就是问题的关键!

           void (*pfunc)(int)语句里面,仅仅有pfunc是变量名称,那么剩余的部分,void(*)(int),就是我们须要的转换类型。因此,新的赋值语句是:

                         pfunc = (void (*)(int)) 0x8999940;

           赋值完毕后,就能够通过pfunc(5); (*pfunc)(5);调用对应的函数了。

     

           假设理解了上面的内容,我们就能够解释void (*signal(int, void (*)(int)))(int)这个相对复杂的问题了

     

    返回函数指针的函数声名

     

    如今我们先抛开上面那个复杂的定义,先看一下以下的需求1) 定义一个函数;2) 该函数具有以下特点,两个參数,返回值是函数指针,而且一个參数也是函数指针。假如返回值和參数函数指针同为void (*)(int); 还有一个函数參数是int型。该函数定义名称为my_func

     

    依据需求我们能够非常easy定义出这样的函数:

     

    typedef void (*HANDLER)(int); // 參数函数和返回函数定义

    HANDLER my_func(int, HANDLER);

     

    突然需求中又不让使用typedef,这就是早期C语言不支持typedef的情况,那么怎样定义这样的函数呢?

    我们假如说my_func的返回值是int,是不是它的定义能够这么写:

    int my_func(int, void (*)(int));

           也就是说,my_func(int, void (*)(int))就是一个int型数据。如今将int换成一个函数,也就是

                  void (*)(int) my_func)(int, void (*)(int);

           这样一种定义,显然这样的语法不支持,那么,实际是怎样表示呢?回过头来,我们先看看函数指针的声明格式

           void (*pfunc)(int)

           当中pfunc 等价于 void (*)(int)。如今在看看上面的格式,是不是非常相识,对了,pfunc就是my_func(int, void (*)(int))如今假设将两者取代一下是不是就成了这样的格式:

                  void (*my_func(int, void(*)(int)))(int)

    假设将my_func换成signal,是不是就是我们文章開始提到的那个复杂声名?如今是不是明确了,原来如此啊,它是一个返回函数指针的的函数声名!

  • 相关阅读:
    移动端web页面使用position:fixed问题
    登录的一些心得
    响应式网页设计
    xss(跨站脚本攻击),crsf(跨站请求伪造),xssf
    HTML5 离线功能介绍
    webapp开发经验和资料
    学习Java,值得你留意的问题(1)更名为《学习Java,容易被你忽略的小细节(1)》
    Python下搜索文件
    从百度地图API接口批量获取地点的经纬度
    获取代理IP地址(BeautifulSoup)
  • 原文地址:https://www.cnblogs.com/zfyouxi/p/4484441.html
Copyright © 2020-2023  润新知