zoukankan      html  css  js  c++  java
  • 回调函数

    ------------恢复内容开始------------

    回调函数

    上网查了很多资料,对回调函数可以这样理解:

      你使用标准库的函数,可以称作直接调用函数,在你的程序中调用系统的函数。

      而回调函数,就是反过来,让系统调用你的函数的一种形式。

    在前2篇博客中我提到了函数指针和指针函数,其中在讲函数指针的时候,提到了将函数的指针作为参数传入另一个函数的例子,这就是回调函数。

    举一个简单的例子:

    #include <stdio.h>
    
    void apple(void)
    {
        printf("i love apple
    ");
    }
    
    void orange(void)
    {
        printf("i love orange
    ");
    }
    
    void blue(void)
    {
        printf("i love blue
    ");
    }
    
    
    void callback(void (*p)(void))
    {
        return p();
    }
    
    
    int main(int argc, char const *argv[])
    {
        callback(apple);
        callback(orange);
        callback(blue);
        return 0;
    }

    在这个函数中,我们定义了3个普通函数,分别是apple orange blue,他们三个函数的类型是相同的

    所以在函数callback中,我们又传入了一个同样类型的指针作为参数,这样通过该函数即可以调用其余同类型的函数。

    还是昨天的例子,我们看一下简单计算器的实现:

    #include <stdio.h>
    
    //定义了一个指针类型
    typedef int (*pFunc)(int,int);
    
    struct cal_t
    {
        int a;
        int b;
        pFunc p;    //结构体里面有一个指针,刚才定义过的指针类型
    };
    
    int calculator(const struct cal_t *ptr);
    
    int calculator(const struct cal_t *ptr)
    {
        return ptr->p(ptr->a,ptr->b);
    }
    
    int add(int a,int b)
    {
        return a + b;
    }
    
    int sub(int a,int b)
    {
        return a - b;
    }
    
    int mul(int a,int b)
    {
        return a * b;
    }
    
    int div(int a,int b)
    {
        return a / b;
    }
    
    
    int main(int argc, char const *argv[])
    {
        int ret = 0;
        struct cal_t myCal;
    
        myCal.a = 12;
        myCal.b = 4;
        myCal.p = div;
    
        ret = calculator(&myCal);
        printf("ret = %d
    ", ret);
        
        return 0;
    }

    首先定义了一个结构体,其实结构体里面就是后面实现函数所需要的参数,然后把结构体作为参数传入回调函数中

    注意,函数也作为指针存在结构体中,然后通过主函数给结构体的成员赋值,实现对函数的调用

      

    ------------恢复内容结束------------

  • 相关阅读:
    mogodb 设置用户名密码认证
    axon mogoconfig
    ListUtils 对 list数据 分组 ,统计,求和 。。。
    jQuery 之 dom操作
    学习Java第二天
    字节跳动spring面试题,你能回答出几个
    CH340芯片选型
    Django的路由转换器的使用
    Vue之cli脚手架
    String中split(regex,limit)方法讲解
  • 原文地址:https://www.cnblogs.com/qifeng1024/p/12466540.html
Copyright © 2011-2022 走看看