前言:
本篇文章我们将继续指针相关知识:回调函数
希望大家在看完后能够有所收获!
回调函数
定义与概念
回调函数是一个通过指针调用的函数。
如果把函数指针作为参数传递给另一个函数,当这个指针被用来调用其所指向的函数时,被调用的函数就是回调函数,回调函数不是有该函数的实现方直接调用,而是在特定的时间或条件发生时有另外的一方调用的,用于对该事件或条件进行响应。
假设有一个函数 A,它接收另一个函数 B 作为参数。当函数 A 在执行过程中达到某个特定条件时,它就会调用函数 B。这里的函数 B 就是回调函数。
是不是有点难以理解?我们先举个简单的实例来解释一下概念。
在该代码中,我们将add函数地址当作参数传递给test函数,然后通过函数指针pf找到add函数完成运算,在这个过程中,add函数就是回调函数。
典型例题
我们来使用回调函数简化编写计算器程序的代码
简化前:
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;
}
通过上面的代码,我们能够完成计算器的基本功能实现,但是我们可以看到有大量的重复代码,导致代码冗余,怎么解决呢?在不使用回调函数的情况下。
我们是否可以尝试将相同的代码提出来?
这样看起来似乎完成了简化代码的操作,我们来测试一下、
可以发现,就算我们选择错误,也会让我们先输入两个操作数,这样在逻辑上就出现了问题,所以这样将相同的代码提出来的方法不可行。
那这里我们应该做呢?如何使用回调函数呢?
简化后:
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函数则专注于执行具体的运算操作,它并不关心具体的运算是什么,只需要接收一个函数指针作为参数,然后调用这个函数指针指向的回调函数进行运算。
- 这种分离使得代码结构更加清晰,各个部分的职责明确,易于理解和修改。
结语:
本篇文章主要讲了回调函数的一些基本概念和例题介绍,后面随着小编学习的深入,会不断更新该模块的更多知识。
标签:calc,函数,int,笔记,break,ret,printf,回调 From: https://blog.csdn.net/2401_85010100/article/details/141242448