C:回调函数的介绍-学习笔记

JonlyMay 2024-09-03 15:35:01 阅读 59

前言:

本篇文章我们将继续指针相关知识:回调函数

希望大家在看完后能够有所收获!

回调函数

 定义与概念

回调函数是一个通过指针调用的函数。

如果把函数指针作为参数传递给另一个函数,当这个指针被用来调用其所指向的函数时,被调用的函数就是回调函数,回调函数不是有该函数的实现方直接调用,而是在特定的时间或条件发生时有另外的一方调用的,用于对该事件或条件进行响应。

假设有一个函数 A,它接收另一个函数 B 作为参数。当函数 A 在执行过程中达到某个特定条件时,它就会调用函数 B。这里的函数 B 就是回调函数。

是不是有点难以理解?我们先举个简单的实例来解释一下概念。

在该代码中,我们将add函数地址当作参数传递给test函数,然后通过函数指针pf找到add函数完成运算,在这个过程中,add函数就是回调函数。

 典型例题

我们来使用回调函数简化编写计算器程序的代码

简化前:

<code>void menu()

{

printf("************************\n");

printf("**** 1.add 2. sub ****\n");

printf("**** 3.mul 4. div ****\n");

printf("****** 0.exit ******\n");

printf("************************\n");

}

int Add(int x, int y)

{

return x + y;

}

int Sub(int x, int y)

{

return x - y;

}

int Mul(int x, int y)

{

return x * y;

}

int Div(int x, int y)

{

return x / y;

}

#include <stdio.h>

int main()

{

int input = 0;

int x = 0;

int y = 0;

int ret = 0;

do

{

menu();

printf("请选择:");

scanf("%d", &input);

switch (input)

{

case 1:

printf("请输入两个操作数:");

scanf("%d %d", &x, &y);

ret = Add(x, y);

printf("%d\n", ret);

break;

case 2:

printf("请输入两个操作数");

scanf("%d %d", &x, &y);

ret = Sub(x, y);

printf("%d\n", ret);

break;

case 3:

printf("请输入两个操作数");

scanf("%d %d", &x, &y);

ret = Mul(x, y);

printf("%d\n", ret);

break;

case 4:

printf("请输入两个操作数");

scanf("%d %d", &x, &y);

ret = Div(x, y);

printf("%d\n", ret);

break;

case 0:

printf("退出计算器\n");

break;

default:

printf("选择错误,请重新选择\n");

break;

}

} while (input);

return 0;

}

通过上面的代码,我们能够完成计算器的基本功能实现,但是我们可以看到有大量的重复代码,导致代码冗余,怎么解决呢?在不使用回调函数的情况下。

我们是否可以尝试将相同的代码提出来?

这样看起来似乎完成了简化代码的操作,我们来测试一下、

可以发现,就算我们选择错误,也会让我们先输入两个操作数,这样在逻辑上就出现了问题,所以这样将相同的代码提出来的方法不可行。

那这里我们应该做呢?如何使用回调函数呢?

简化后:

<code>void menu()

{

printf("************************\n");

printf("**** 1.add 2. sub ****\n");

printf("**** 3.mul 4. div ****\n");

printf("****** 0.exit ******\n");

printf("************************\n");

}

int Add(int x, int y)

{

return x + y;

}

int Sub(int x, int y)

{

return x - y;

}

int Mul(int x, int y)

{

return x * y;

}

int Div(int x, int y)

{

return x / y;

}

calc(int(*pf)(int, int))

{

int x = 0;

int y = 0;

int ret = 0;

printf("请输入两个操作数:");

scanf("%d %d", &x, &y);

ret = pf(x, y);

printf("%d\n", ret);

}

#include <stdio.h>

int main()

{

int input = 0;

do

{

menu();

printf("请选择:");

scanf("%d", &input);

switch (input)

{

case 1:

calc(Add);//将加法函数

break;

case 2:

calc(Sub);

break;

case 3:

calc(Mul);

break;

case 4:

calc(Div);

break;

case 0:

printf("退出计算器\n");

break;

default:

printf("选择错误,请重新选择\n");

break;

}

} while (input);

return 0;

}

在上面代码中的calc函数,具有通用功能,可以计算 + - * / 四种运算,它通过接收传递过来的函数地址,来找到对应的函数,比如说将Add函数地址传递给calc函数,然后calc函数再通过函数指针pf找到函数Add完成加法运算。

 回调函数的作用

1.回调函数能够提高代码的复用性

calc函数可以被不同的运算函数调用,实现了代码的复用。无论是什么运算,只要符合函数指针的类型要求,都可以作为回调函数传递给calc进行运算。例如,如果在其他地方也需要进行类似的运算操作,可以直接调用calc函数,并传入相应的回调函数,而不需要重复编写输入处理和结果输出的代码。

2.回调函数的使用可以使得整个工程中有清晰的代码结构

menu函数负责展示菜单和接收用户输入,switch 语句根据用户输入决定调用哪个运算函数作为回调。而calc函数则专注于执行具体的运算操作,它并不关心具体的运算是什么,只需要接收一个函数指针作为参数,然后调用这个函数指针指向的回调函数进行运算。这种分离使得代码结构更加清晰,各个部分的职责明确,易于理解和修改。

结语:

本篇文章主要讲了回调函数的一些基本概念和例题介绍,后面随着小编学习的深入,会不断更新该模块的更多知识。



声明

本文内容仅代表作者观点,或转载于其他网站,本站不以此文作为商业用途
如有涉及侵权,请联系本站进行删除
转载本站原创文章,请注明来源及作者。