C语言进阶:进阶指针(下)

一、 函数指针数组

我们都知道 数组是一个存放相同类型数据的存储空间 那我们已经学习了指针数组

那么函数有没有对应的指针数组呢? 如果有那应该怎么定义呢?

1. 函数指针数组的定义

我们说 函数指针数组的定义 应该遵循以下格式

int (*p[10])();

首先p和[]结合说明了它是一个数组
我们再将它拿掉可以发现 数组的内容就是
int (*)() 类型的函数指针。

2. 函数指针数组的用途:转移表(以计算器为例)

我们首先来写一段代码实现计算器的功能

void mune()
{
	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;
}

int main()
{
	int input = 0;
	int x = 0;
	int y = 0;
	int ret = 0;
	do
	{
		mune();
		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;
		case 0:
			printf("退出计算器\n");
			break;
		default:
			printf("选择错误,请重新选择\n");
		}
	} while (input);
	return 0;
}

那么我们再使用函数指针来实现试试

void mune()
{
	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;
}
//函数指针数组存放上述函数
//转移表
int (*pf[5])(int x, int y) = { NULL, Add, Sub, Mul, Div };

int main()
{
	int input = 0;
	int x = 0;
	int y = 0;
	int ret = 0;
	do
	{
		mune();
		printf("请选择:>");
		scanf("%d", &input);
		if (input == 0)
		{
			printf("退出计算器\n");
		}
		else if (input >= 1 && input <= 4)
		{
			printf("请输入两个操作符:>");
			scanf("%d %d", &x, &y);
			ret = pf[input](x, y);
			printf("%d\n", ret);
		}
		else
		{
			printf("选择错误\n");
		}
	
	} while (input);
	return 0;
}

二、回调函数

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

void mune()
{
	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;
}

int main()
{
	int input = 0;
	int x = 0;
	int y = 0;
	int ret = 0;
	do
	{
		mune();
		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;
		case 0:
			printf("退出计算器\n");
			break;
		default:
			printf("选择错误,请重新选择\n");
		}
	} while (input);
	return 0;
}

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

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

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

定义

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

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

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

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

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

完整代码如下

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

int main()
{
	int input = 0;
	do
	{
		mune();
		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");
		}
	} while (input);
	return 0;
}

让我们试试它的运行结果

可以完美运行的

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/576836.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

UniAD:以规划为导向的端到端自动驾驶

文章链接 这个文章是CVPR2023 Best Paper https://arxiv.org/pdf/2212.10156 提出背景 以往的自动驾驶多数是为不同的任务场景设计部署单独的模型&#xff0c;这样子组成的系统会很复杂如图a。 图b这是多任务共享一个主干&#xff0c;但还是要分离训练&#xff0c;而且不是…

03_Scala变量和数据类型

文章目录 [toc] **变量和数据类型****1.注释****2.变量和常量****3. 标识符的命名规范****4.scala的字符串****5.键盘输入****5.1 StdIn.readLine()****5.2 从文件中读取数据****5.3 Scala向外写数据** 变量和数据类型 1.注释 和Java完全一样 ** ** 2.变量和常量 var name…

外包干了4个月,技术退步明显

先说情况&#xff0c;大专毕业&#xff0c;18年通过校招进入湖南某软件公司&#xff0c;干了接近6年的功能测试&#xff0c;今年年初&#xff0c;感觉自己不能够在这样下去了&#xff0c;长时间呆在一个舒适的环境会让一个人堕落&#xff01; 而我已经在一个企业干了四年的功能…

攻防世界 easyphp

本题主要利用的知识点是php绕过 一、PHP代码分析 首先先看一下代码 我们需要利用get方式上传3个参数a,b,c&#xff0c;这3个分别需要满足不同的条件: a&#xff1a;设置a值&#xff1b;值大于6000000&#xff1b;长度不超过3&#xff1b; b&#xff1a;设置b值&#xff1b;MD…

《QT实用小工具·三十五》基于PathView,Qt/QML做的一个可以无限滚动的日历控件

1、概述 源码放在文章末尾 改项目实现了基于PathView&#xff0c;Qt/QML做的一个可以无限滚动的日历控件&#xff0c;下面是demo演示&#xff1a; 项目部分代码如下所示&#xff1a; import QtQuick 2.7 import QtQuick.Controls 1.4 import QtQuick.Controls.Styles 1.4Bu…

基于Spring Boot的口腔管理平台设计与实现

基于Spring Boot的口腔管理平台设计与实现 开发语言&#xff1a;Java框架&#xff1a;springbootJDK版本&#xff1a;JDK1.8数据库工具&#xff1a;Navicat11开发软件&#xff1a;eclipse/myeclipse/idea 系统部分展示 管理员登录界面图&#xff0c;管理员登录进入口腔管理平…

Spring Cloud OpenFeign使用

OpenFeign源于Netflix的Feign&#xff0c;是http通信的客户端。屏蔽了网络通信的细节&#xff0c;直接面向接口的方式开发&#xff0c;让开发者感知不到网络通信细节。 所有远程调用&#xff0c;都像调用本地方法一样完成。 Spring Cloud OpenFeign 是 Spring Cloud 对 Feign …

Unity AssetsBundle打包

为什么要使用AssetsBundle包 减少安装包的大小 默认情况下&#xff0c;unity编译打包是对项目下的Assets文件夹全部内容进行压缩打包 那么按照这个原理&#xff0c;你的Assets文件夹的大小将会影响到你最终打包出的安装包的大小&#xff0c;假如你现在正在制作一个游戏项目&…

Aigtek:功率信号源是什么东西

功率信号源是一种电子设备&#xff0c;它可以提供可控的、稳定的高功率输出信号。通常用于测试和校准功率放大器、天线等设备&#xff0c;以及进行无线通信、雷达和卫星导航等应用中。下面将详细介绍功率信号源的概念、功能和特点。 功率信号源的概念 功率信号源是指能够产生可…

SCSS的基本使用(一)

目录 一、使用&符号来引用父选择器 二、scss的语法 三、变量&#xff08;Variables&#xff09; 四、嵌套&#xff08;Nesting&#xff09; 五、mixin 和 include 六、extend 继承 七、import 与 Partials 八、if简单判断 九、if复杂判断 一、使用&符号来引用父…

鸿蒙云函数调试坑点

如果你要本地调试请使用 const {payload, action} event.body/** 本地调试不需要序列化远程需要序列化 */ // const {payload, action} JSON.parse(event.body) const {payload, action} event.body 注意: 只要修改云函数&#xff0c;必须上传云函数 如果使用 const {pay…

【服务器部署篇】Jenkins配置后端工程自动化部署

作者介绍&#xff1a;本人笔名姑苏老陈&#xff0c;从事JAVA开发工作十多年了&#xff0c;带过刚毕业的实习生&#xff0c;也带过技术团队。最近有个朋友的表弟&#xff0c;马上要大学毕业了&#xff0c;想从事JAVA开发工作&#xff0c;但不知道从何处入手。于是&#xff0c;产…

【亲测对比】大厂云服务器2-64G对比表 不卡顿 幻兽帕鲁 我的世界 雾锁王国 饥荒联机版 英灵神殿通用

更新日期&#xff1a;4月26日&#xff08;京东云采购季持续进行&#xff09; 本文纯原创&#xff0c;侵权必究 《最新对比表》已更新在文章头部—腾讯云文档&#xff0c;文章具有时效性&#xff0c;请以腾讯文档为准&#xff01; 【腾讯文档实时更新】2024年-幻兽帕鲁服务器专…

C语言系列文章 | 初识C语言

首先分为几个方面来和各位读者介绍C语言&#xff0c;并在之后的学习过程中不断地和各位读者去分享我学习的经历。 坐好&#xff0c;发车咯~目录如下&#xff1a;1. C语言是什么&#xff1f;2. C语言的历史和辉煌3. 编译器的选择VS20224. VS项目和源⽂件、头⽂件介绍5. 第⼀…

关于java对接微信公众号(对接百度AI实现图片文字识别,对接聚合数据实现笑话、谜语大全,成语接龙等功能)

前言&#xff1a; 只是自己学习使用&#xff0c;所以有点不规范&#xff0c;请见谅 本文直接附上源码与效果图&#xff0c;具体操作步骤请参考另一篇文章&#xff1a;http://t.csdnimg.cn/PQu25 1.运行效果图 1.1 关注事件 1.2 笑话大全 1.3 谜语大全 1.3 多级菜单 1.4 按钮…

MySQL基础知识——MySQL索引

深入浅出索引 索引的意义 索引的意义&#xff1a;在大量数据中&#xff0c;加速访问少量特定数据&#xff1b; 使用索引的前提条件&#xff1a; 1&#xff09;索引块数量小于数据块数量&#xff1b; 2&#xff09;索引键有序&#xff0c;故可以使用二分查找等高效的查找方式&…

互联网安全面临的全新挑战

前言 当前移动互联网安全形势严峻&#xff0c;移动智能终端漏洞居高不下、修复缓慢&#xff0c;移动互联网恶意程序持续增长&#xff0c;同时影响个人和企业安全。与此同时&#xff0c;根据政策形势移动互联网安全监管重心从事前向事中事后转移&#xff0c;需加强网络安全态势感…

ETF期权是什么详解

ETF期权是什么 ETF期权的本质是一种金融衍生品&#xff0c;与交易所交易基金&#xff08;Exchange-Traded Fund&#xff0c;简称ETF&#xff09;相关的期权合约。其核心在于赋予了投资者在未来某个时间点以约定价格买入或卖出特定ETF&#xff08;交易所交易基金&#xff09;的…

百望云发布金盾企业经营大模型,暨光明食品、法雷奥、西奥电梯财税数字化实践分享

百望云发布金盾企业经营大模型&#xff0c;暨光明食品、法雷奥、西奥电梯财税数字化实践分享 数字化转型思想指导下&#xff0c;如何标定好、利用好、管理好数据资产&#xff0c;已经成为企业寻找发展新动能的着力点。 基于此&#xff0c;“2024数字商业创新论坛”于4月26号在上…

2017美亚杯--个人赛

1、Gary的笔记本电脑已成功取证并制作成镜像 (Forensic Image)&#xff0c;下列哪个是其MD5哈希值。A.0CFB3A0BB016165F1BDEB87EE9F710C9 B.5F1BDEB87EE9F710C90CFB3A0BB01616 C.A0BB016160CFB3A0BB0161661670CFB3 D.16160CFB3A0BB016166A0BB016166167 E.FB3A0BB016165 B016166…