C语言_回调函数

1> 函数指针

指向函数的指针变量简称为【函数指针】

1.1> 代码例程

#include "stdio.h"

int add(int a, int b);

int main(void)
{
    int y = 0;
    int (*fun)(int a, int b) = NULL;
    fun = add;

    y = add(1, 1);
    printf("y  : %d\n", y);
    printf("add: 0x%X\n", add);
    printf("add: 0x%p\n", &add);

    printf("----------------------\n");

    y = fun(1, 1);
    printf("y  : %d\n", y);
    printf("fun: 0x%X\n", fun);
    printf("fun: 0x%p\n", &fun);

}


int add(int a, int b)
{
    return a+b;
}

1.2> 运行结果

y  : 2
add: 0x401432
add: 0x00401432
----------------------
y  : 2
fun: 0x401432
fun: 0x0060FEF8

1.3> 分析总结

2



2> 回调函数

2.1> 代码例程

#include "stdio.h"

int add(int a, int b);
int sub(int a, int b);
int op_func(int (*fun_p)(int a, int b), int a, int b);

int main(void)
{
    int a = 2;
    int b = 1;
    int y = 0;

    y = op_func(add, a, b);
    printf("y = %d\n", y);

    y = op_func(sub, a, b);
    printf("y = %d\n", y);

    
    return 0;
}


int add(int a, int b)
{
    return a+b;
}

int sub(int a, int b)
{

    return a-b;
}


int op_func(int (*fun_p)(int a, int b), int a, int b)
{
    return fun_p(a, b);
}


2.2> 运行结果

y = 3
y = 1

2.3> 分析总结

main() — 调用 —>op_func( ) —通过func_p回调—> add() / sub();
add() / sub, 成为回调函数;

2.4> 回调函数优点1

1》将程序分为3层:
应用层 ----> main();
中间层-----> op_func();
底层--------> add() / sub;
分工明确,减少耦合;



3> 结构体实现回调函数

3.1> 代码例程

#include "stdio.h"

typedef struct {
    int a;
    int b;
    int (*fun_p)(int a, int b);  //函数指针
}op_t;


int add(int a, int b);
int sub(int a, int b);

int main(void)
{
    op_t myop;
    int y = 0;

    myop.a = 2;
    myop.b = 1;
    myop.fun_p = add; // 函数指针赋值

    y = myop.fun_p(myop.a, myop.b); // 调用回调函数
    printf("y = %d\n", y);

    myop.fun_p = sub;
    y = myop.fun_p(myop.a, myop.b);
    printf("y = %d\n", y);

    return 0;
}


//----------- 回调函数 ---------//

int add(int a, int b)
{
    return a+b;
}

int sub(int a, int b)
{
    return a-b;
}

3.2> 运行结果

y = 3
y = 1

3.3> 分析总结

回调函数过程:定义一个函数指针变量,给函数指针变量赋值,调用函数;

3.4> 回调函数优点2

结构体中只需要int (*fun_p)(int a, int b); //函数指针,减少内存开销;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值