• C语言之函数指针、回调函数的使用


    一、背景

    首先看下如下代码,这个定义是放在头文件的,在程序中tCdrvCallbackFkt也定义了另一个变量,而且括号后面还跟定义了几个变量,不理解这个定义。

    typedef void (PUBLIC *tCdrvCallbackFkt) (tCDrv_Handle CdrvHandle_p,
                                             tCDrv_Event Event_p,
                                             LPARAM pArg_p,
                                             DWORD dwParam_p);
    

    最近在跟别人的代码,要更改别人的代码,所以必须是理解每一行代码的意义和如何使用,遇到关于函数指针的使用,还有回调函数的使用。通过查资料来理解下定义的这个函数指针。

    二、函数指针的使用

    先不去看上面定义的这个函数指针,从最基本的模型理解起:

    int (*p)();
    

    上面定义p为一个指向函数的指针变量,函数返回值为整形。定义时要注意最后的空括号表示指针变量所指的是一个函数。
    下面例子说明下,通过代码的注释进行理解。

    #include"stdio.h"
    
    typedef void(*p)(char* s);    //定义了一个函数指针类型
    
    void str(char* s);
    
    int main()
    {
       p test;                   //定义一个函数指针test 
       test=str;                 //将str函数的入口地址赋给test,即指针取地址
       test("Hello World
    ");    //函数指针test调用str函数,即函数指针取str函数里边的内容
       return 0;
    }
    
    void str(char* s)
    {
        printf("%s",s);
    }
    

    再来看typedef void (PUBLIC *tCdrvCallbackFkt) ()其实就是自命名定义了一个函数指针的类型,这样方便对其它函数指针的定义。

    三、回调函数的使用

    有了函数指针的基础后,看下如何使用回调函数,回调函数,就是使用者自己定义一个函数,使用者只管实现自己程序的内容而不用去管怎样被调用,然后把这个函数作为参数传入别人(或系统)的函数中,由别人(或系统)的函数在运行时来调用的函数。函数是你实现的,但由别人(或系统)的函数在运行时通过参数传递的方式调用,这就是所谓的回调函数。简单来说,就是由别人的函数运行期间来回调你实现的函数。下面例子说明,看代码注释理解:

    #include"stdio.h"
    
    typedef void(*p)(char* s);       //定义了一个函数指针类型
    
    void str(char* s);               //函数声明
    
    void Mycallback(p test,char* s)  //实现回调函数调用的函数,对于p test也可以写成 void(*test)(),此函数只管去实现调用,程序里边具体怎样实现不用管
    {
        test(s);
    }
    
    int main()
    {
    
        Mycallback(str,"Hello");     //回调函数在主程序中实现调用,对于调用回调函数人来说只需要去理解调用的函数传入那些参数就好,不管函数里边内容的具体实现
        return 0;
    }
    
    void str(char* s)                //自己定义的回调函数,对于回调函数来说只管去实现程序内容
    {
        printf("%s",s);
    }
    
    

    四、参考文档

    http://qiaopeng688.blog.51cto.com/3572484/1727246
    http://www.cnblogs.com/ioleon13/archive/2010/03/02/1676621.html
    http://blog.chinaunix.net/uid-8318378-id-2032233.html

    by 羊羊得亿
    2017-05-19 ShenZhen

  • 相关阅读:
    APS.NET MVC + EF (01)---Linq和Lambda表达式
    APS.NET MVC + EF (00)---C#基础
    Asp.net MVC 之ActionResult
    在ASP.NET MVC中加载部分视图的方法及差别
    Entity Framework Codefirst数据迁移
    Entity Framework Codefirst的配置步骤
    02:PostgreSQL Character Sets
    安装postgis,使用postgis导入shapefile的步骤总结
    WebGIS实现在线要素编辑之ArcGIS Server 发布Feature Service 过程解析
    DEM数据及其他数据下载
  • 原文地址:https://www.cnblogs.com/yangxuli/p/6877869.html
Copyright © 2020-2023  润新知