• 回调函数的简单使用0717


    什么是回调函数

    函数名可以用来作为参数的函数称为回调函数。

    回调函数作用

    • 可以子啊恰当时候发送通知指令
    • 使代码更加的灵活
    • 可以提高代码的效率

    C语言函数指针如何定义

     int (*pfunc)(int, int);  //声明函数的函数指针
    
    • 1

    上面是下面函数的函数指针,两者的函数返回值指类型相同,函数的形参类型和数目相同,函数名的部分是有小括号括起来,加上*号。最后写上函数指针名字,函数指针名字最为标识符,你愿意写什么样的都可以,就相当于一个变量,自己命名就好

    int Add(int a, int b) { return a + b; }
    
    • 1

    函数指针的应用场景

    第一种情况:

    首先定义一个函数

    int Add(int a, int b) { return a + b; }
    
    • 1

    其次,编写一个函数,里面声明一个函数指针,使用函数指针调用函数

    void TestHDFunOne() {
        int a = 1;
        int b = 9;
    
        int sum = Add(a, b);
        printf("sum = %d\n", sum);
    
        int (*pfunc)(int, int);  //声明函数的函数指针
        pfunc = Add;  //对函数指针赋值,函数指针 = 函数名;
        
        int sum1 = pfunc(a, b);  //函数指针名调用函数,C++
        printf("sum1 = %d\n", sum1);
    
        int sum2 = (*pfunc)(a, b);  //函数指针名调用函数,C
        printf("sum2 = %d\n", sum2);
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    最后,在main 函数调用函数TestHDFunOne()

    int main() {
        printf("start\r\n");
        TestHDFunOne();
        return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5

    结果:
    在这里插入图片描述

    第二种情况:无返回值回调函数

    首先
    定义两个没有返回值,没有形参的函数

    void ChiZaoFan() { printf("吃早饭\n"); }
    
    void ChiWanFan() { printf("吃晚饭\n"); }
    
    • 1
    • 2
    • 3

    其次,定义回调函数
    回调函数吴返回值,形参是上面定义的无返回值、无形参的函数的函数指针

    void TestHDFunTow(void (*fp)()) {
        printf("开始\n");
    
        (*fp)();//函数的具体调用语句
    
        printf("结束\n");
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    最后,在主函数调用回调函数

    int main() {
        printf("start\r\n");
        TestHDFunTow(ChiZaoFan);
        TestHDFunTow(ChiWanFan);
        return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    结果:
    在这里插入图片描述

    第三种情况:回调函数调用有形参的函数

    首先:定义两个有形参的函数

    void ChiZaoFanFood(int food) { printf("吃早饭:%d\n", food); }
    
    void ChiWanFanFood(int food) { printf("吃晚饭:%d\n", food); }
    
    • 1
    • 2
    • 3

    其次, 定义回调函数,这使用的是在回调函数的内部传递实参

    void TestHDFunThree(void (*fp)(int)) {
        printf("开始\n");
        int c = 1;  //函数内部将实传入
        (*fp)(c);
    
        printf("结束\n");
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    主函数

    int main() {
        printf("server start\r\n");
        NetClientInit(NetClintRecv);
    
        TestHDFunThree(ChiZaoFanFood);
        TestHDFunThree(ChiWanFanFood);
    
        return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    在这里插入图片描述

    第四种情况:回调函数调用有形参的函数,有外部传入参数

    首先,定义函数

    void ChiZaoFanFood(int food) { printf("吃早饭:%d\n", food); }
    
    void ChiWanFanFood(int food) { printf("吃晚饭:%d\n", food); }
    
    • 1
    • 2
    • 3

    其次,定义回调函数,注意,这里的回调函数的形参多了一个

    void TestHDFunFour(void (*fp)(int), int c) {
        printf("开始\n");
        (*fp)(c);
        printf("结束\n");
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5

    主函数

    int main() {
        printf("server start\r\n");
    
        TestHDFunFour(ChiZaoFanFood, 2);
        TestHDFunFour(ChiWanFanFood, 3);
    
        return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    结果:
    在这里插入图片描述

    从外传入实参的回调函数就比从里面传入的更加可以灵活使用

    参考资料:
    1、函数指针和回调函数
    2、回调函数是个啥?

  • 相关阅读:
    java-php-python-ssm-校园网上跳蚤书市系统-计算机毕业设计
    线性表01- 数组与简易接口设计
    多维高斯分布(多元正态分布)的概率密度函数和最大似然估计
    SpringBoot集成Prometheus实现监控
    多表查询以及外键约束
    helm tekonci 技术总结待续
    CE修改器学习历程之指针变量的保存
    【python基础】循环语句-break关键字
    培训软件测试能不能就业
    算法第二十六天-删除有序数组中的重复项Ⅱ
  • 原文地址:https://blog.csdn.net/qq_43441284/article/details/126391775