• 回调函数的简单使用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——4.1栈(数组实现栈、链表实现栈)
    Python教程:文件和读写的详细教程
    golang channel
    冒泡排序、选择排序、插入排序、希尔排序
    经典算法|水仙花数|自幂数
    前端的小组件
    CentOS8使用阿里云yum源异常问题及解决方法
    【算法】树状数组数据结构
    前缀和(c++,超详细,含二维)
    Bean的生命周期
  • 原文地址:https://blog.csdn.net/qq_43441284/article/details/126391775