当前位置: 首页 > news >正文

c语言进阶:指针的进阶(下)

回调函数

我们还是以计算器为例来解释回调函数的使用

int main()
{
	int x, y;
	int input = 1;
	int ret = 0;
	do
	{
		printf("***********************\n");
		printf("1:add               2:sub\n");
		printf("3:mul               4:div\n");
		printf("***********************\n");
		printf("请选择 ");
		scanf("%d", &input);
		switch (input)
		{
		case 1:
			printf("请输入两个操作数\n");
			scanf("%d %d", &x, &y);
			ret = add(x, y);
			printf("%d\n", ret);
			break;
		case 2:
			printf("请输入两个操作数\n");
			scanf("%d %d", &x, &y);
			ret = sub(x, y);
			printf("%d\n", ret);
			break;
		case 3:
			printf("请输入两个操作数\n");
			scanf("%d %d", &x, &y);
			ret = mul(x, y);
			printf("%d\n", ret);
			break;
		case 4:
			printf("请输入两个操作数\n");
			scanf("%d %d", &x, &y);
			ret = div(x, y);
			printf("%d\n", ret);
			break;
		default:
			printf("输入错误\n");
			break;
		}
	} while (input);
	return 0;
}

我们可以发现 case1 2 3 4里面有大量冗余的代码

那么我们可不可以通过一定的手段解决这个问题呢?

答案是可以 就是使用回调函数

定义

回调函数就是一个被作为参数传递的函数。

我们来设计一个case_()函数 并且将add div这些函数作为参数传递进去

要求: 可以实现和原函数一样的功能 代码不能冗余

void calc(int(*p)(int x, int y))
{
	int x = 0;
	int y = 0;
	int ret = 0;
	printf("请输入两个操作数\n");
	scanf("%d %d", &x, &y);
	ret = p(x, y);
	printf("%d\n", ret);
}

这就是上面思想指导写出来的代码

完整代码如下

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 calc(int(*p)(int , int ))
{
	int x = 0;
	int y = 0;
	int ret = 0;
	printf("请输入两个操作数\n");
	scanf("%d %d", &x, &y);
	ret = p(x, y);
	printf("%d\n", ret);
}

int main()
{
	int x, y;
	int input = 1;
	int ret = 0;
	do
	{
		printf("***********************\n");
		printf("1:add               2:sub\n");
		printf("3:mul               4:div\n");
		printf("***********************\n");
		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;
		default:
			printf("输入错误\n");
			break;
		}
	} while (input);
	return 0;
}

让我们试试它的运行结果

在这里插入图片描述
可以完美运行的

本来是向给大家分上下两期讲完指针进阶的 但是好像上一期写的太多内容了 这一期只有一个回调函数可以写

还有大量的指针题目我想放到配套作业专栏里去

那这一期就先这样啦

以上就是本篇博客的全部内容啦 由于博主才疏学浅 所以难免会出现纰漏 希望大佬们看到错误之后能够

不吝赐教 在评论区或者私信指正 博主一定及时修正

那么大家下期再见咯

相关文章:

  • 嵌入式开发之驱动测试实践
  • GAMES101 路径追踪
  • CCF- CSP 202009-2风险人群筛查 满分题解
  • 《Python3 网络爬虫开发实战》:什么是AJAX?
  • 超详细Python自动化测试学习指南,附学习路线图+企业真实项目。看完月薪30K指日可待。。。
  • 卷积神经网络基础
  • PCIe系列专题之二:2.1 TLP的前世今生
  • 【面经】HTTP篇
  • web自动化测试(selenium.webdriver)
  • grpc和protobuf在一起
  • 1. HelmTemplate 3分钟将项目打包成Helm Chart并部署至k8s
  • 【Shell】算术运算符、流程控制、函数使用、数组以及加载其它文件的变量
  • Redis 备份恢复(持久化)手册
  • 【Linux】01-Linux系统CentOS7虚拟机VMware安装保姆级教程
  • Go语言各种扩容机制(防止混淆)
  • Cookie 在前端中的实践
  • mysql 数据库四种事务隔离级别
  • PhantomJS 安装
  • 记录:CentOS7.2配置LNMP环境记录
  • 那些年我们用过的显示性能指标
  • 悄悄地说一个bug
  • 如何在GitHub上创建个人博客
  • 入门到放弃node系列之Hello Word篇
  • 设计模式走一遍---观察者模式
  • 使用SAX解析XML
  • 一个项目push到多个远程Git仓库
  • Redis4.x新特性 -- 萌萌的MEMORY DOCTOR
  • 智能情侣枕Pillow Talk,倾听彼此的心跳
  • ​LeetCode解法汇总2182. 构造限制重复的字符串
  • (01)ORB-SLAM2源码无死角解析-(66) BA优化(g2o)→闭环线程:Optimizer::GlobalBundleAdjustemnt→全局优化
  • (Note)C++中的继承方式
  • (附源码)spring boot网络空间安全实验教学示范中心网站 毕业设计 111454
  • (附源码)计算机毕业设计SSM基于java的云顶博客系统
  • (黑客游戏)HackTheGame1.21 过关攻略
  • (十二)springboot实战——SSE服务推送事件案例实现
  • (五)关系数据库标准语言SQL
  • (小白学Java)Java简介和基本配置
  • (一)pytest自动化测试框架之生成测试报告(mac系统)
  • (一)python发送HTTP 请求的两种方式(get和post )
  • (一)基于IDEA的JAVA基础12
  • (转)甲方乙方——赵民谈找工作
  • (轉貼) 蒼井そら挑戰筋肉擂台 (Misc)
  • ***测试-HTTP方法
  • .gitignore文件---让git自动忽略指定文件
  • .net 7 上传文件踩坑
  • .net core webapi 部署iis_一键部署VS插件:让.NET开发者更幸福
  • .NET Core 网络数据采集 -- 使用AngleSharp做html解析
  • .Net Core 中间件验签
  • .Net 代码性能 - (1)
  • .NET4.0并行计算技术基础(1)
  • @Async注解的坑,小心
  • @RequestMapping 的作用是什么?
  • [ 常用工具篇 ] POC-bomber 漏洞检测工具安装及使用详解
  • [1127]图形打印 sdutOJ
  • [4.9福建四校联考]