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

前言:

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

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

回调函数

 定义与概念

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

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

假设有一个函数 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函数则专注于执行具体的运算操作,它并不关心具体的运算是什么,只需要接收一个函数指针作为参数,然后调用这个函数指针指向的回调函数进行运算。
  • 这种分离使得代码结构更加清晰,各个部分的职责明确,易于理解和修改。

结语:

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值