【小白学C语言之回调函数】

回调函数是通过函数指针调用的函数,常用于在特定事件发生时进行响应。文章通过一个计算器程序的示例,展示了如何使用函数回调减少代码冗余,提高效率。在主函数中,根据用户选择调用不同的计算方法,实现了功能的封装和简化。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、回调函数的概念

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

这个概念是在鹏哥的视频指针进阶部分有讲过的,这段文字很抽象,看了之后还是有点难以get到何为抽象函数是吧?不要担心,马上就来讲解

简单来说就是,把A函数以指针形式传递给B函数,然后在B函数里头用A函数的地址重新去调用A函数的过程就是函数回调。

二、实际演示 

鹏哥讲的这个计算器的例子,我觉得用来理解函数回调是再好不过了

首先来看,如果没有使用函数回调的代码是这样子的:

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;
}

void menu()
{
	printf("**************************\n");
	printf("**** 1. add    2. sub ****\n");
	printf("**** 3. mul    4. div ****\n");
	printf("****     0. exit      ****\n");
	printf("**************************\n");
}

int main()
{
	int input = 0;
	//计算器-计算整型变量的加、减、乘、除
	//a&b a^b a|b a>>b a<<b a>b

	do {
		menu();
		
		int x = 0;
		int y = 0;
		int ret = 0;
		printf("请选择:>");
		scanf("%d", &input);

		switch (input)
		{
		case 1:
			printf("请输入2个操作数>:");
			scanf("%d %d", &x, &y);
			ret = Add(x, y);
			printf("ret = %d\n", ret);
			break;
		case 2:
			printf("请输入2个操作数>:");
			scanf("%d %d", &x, &y);
			ret = Sub(x, y);
			printf("ret = %d\n", ret);
			break;
		case 3:
			printf("请输入2个操作数>:");
			scanf("%d %d", &x, &y);
			ret = Mul(x, y);
			printf("ret = %d\n", ret);
			break;
		case 4:
			printf("请输入2个操作数>:");
			scanf("%d %d", &x, &y);
			ret = Div(x, y);
			printf("ret = %d\n", ret);
			break;
		case 0:
			printf("退出程序\n");
			break;
		default:
			printf("选择错误,重新选择!\n");
			break;
		}
		
	} while (input);
	return 0;
}

我们可以看到,在switch语句中有大量冗余代码,这在实际开发中是效率极为低下的。

接着我们再来看看使用了函数回调的函数表现如何:

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;
}

void menu()
{
	printf("**************************\n");
	printf("**** 1. add    2. sub ****\n");
	printf("**** 3. mul    4. div ****\n");
	printf("****     0. exit      ****\n");
	printf("**************************\n");
}

int Calc(int (*pf)(int, int))
{
	int x = 0;
	int y = 0;
	printf("请输入2个操作数>:");
	scanf("%d %d", &x, &y);
	return pf(x, y);
}

int main()
{
	int input = 0;
	do {
		menu();

		int ret = 0;
		printf("请选择:>");
		scanf("%d", &input);

		switch (input)
		{
		case 1:
			ret = Calc(Add);
			printf("ret = %d\n", ret);
			break;
		case 2:
			ret = Calc(Sub);
			printf("ret = %d\n", ret);
			break;
		case 3:
			ret = Calc(Mul);//
			printf("ret = %d\n", ret);
			break;
		case 4:
			ret = Calc(Div);//
			printf("ret = %d\n", ret);
			break;
		case 0:
			printf("退出程序\n");
			break;
		default:
			printf("选择错误,重新选择!\n");
			break;
		}

	} while (input);
	return 0;
}

可以看到其实函数回调一般都是用于在一个函数中利用传递过来的地址去调用另一个函数,这样可以提高计算机运算的效率。

当然,关于这个计算器的代码还有其他一些优化思路,比如使用函数指针数组进行优化,但这跟本文讨论的主题没有太大关系,所以我会留着以后再讲

三、总结

函数回调就是在把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用来调用其所指向的函数时,这个过程是回调函数。

在某些地方,函数回调使用的好了,可以代码减少不必要的冗余,同时也会增加运算的效率

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

爱敲代码的罗根

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值