函数指针数组

news/2024/5/18 15:57:57

前面学习过数组 指针数组:用来存放数组指针(地址)的数组

int main()
{int arr1[] = { 0 };int arr2[] = { 0 };int arr3[] = { 0 };int* p[3] = { arr1,arr2,arr3 };//指针数组return 0;
}

那么函数指针数组,就是用来存放几个类型相同的函数地址(指针)的数组
我们用代码写一个计算器的例子:
在这里插入图片描述
函数指针数组的使用——计算器
之前我们想写一个简单的计算器是这样的:

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");}
int main()
{int stup = 0;int x = 0;int y = 0;int ret = 0;do{menu();printf("请选择>");scanf("%d", &stup);switch (stup){case 1:printf("请输入两个操作数>");scanf("%d %d", &x, &y);ret=ADD(x, y);printf("ret= %d\n", ret);break;case 2:printf("请输入两个操作数>");scanf("%d %d", &x, &y);ret = Sub(x, y);printf("ret= %d\n", ret);break;case 3:printf("请输入两个操作数>");scanf("%d %d", &x, &y);ret = Mul(x, y);printf("ret= %d\n", ret);break;case 4:printf("请输入两个操作数>");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 (stup);//int(*p[4])(int, int) = { ADD,Sub,Mul,Div };return 0;
}

运行结果:
在这里插入图片描述
上述代码虽然可以实现计算机的功能但是我们发现
在这里插入图片描述
这段代码中出来函数名发生改变,其他的都没变,显的有一点冗余

那么我们是不是可以写一个函数指针数组来把这几个函数的地址存放在同一数组中,当想使用那个函数时,只需要找到这个函数地址对用的下标,然后就可以实现函数的调用了呢

利用此思路,我们来改造计算器代码

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");}
int main()
{int stup = 0;int x = 0;int y = 0;int ret = 0;int(*arr[5])(int, int) = {NULL,ADD,Sub,Mul,Div};
do
{menu();printf("请选择>");scanf("%d", &stup);if (stup >= 1 && stup <= 4){printf("请输入两个操作数>\n");scanf("%d %d", &x, &y);ret = arr[stup](x, y);printf("ret= %d\n", ret);}else if(stup==0){printf("退出计算器");}else{printf("选择错误重新选择>\n");}
} while (stup);return 0;
}

在这里插入图片描述


http://www.mrgr.cn/p/70768468

相关文章

PyTorch - GPU入门教程1

1. 安装GPU版本的PyTorch 登录PyTorch官网https://pytorch.org/&#xff0c;下载对应CUDA版本的PyTorch【不能直接pip install&#xff0c;否则安装上的是CPU版本的】 2. 查看GPU信息 &#xff08;1&#xff09;重要信息 !nvidia-smi我的GPU版本很垃圾&#xff0c;本blog仅…

GitHub上怎么寻找项目?

前言 下面由我精心整理的关于github项目资源搜索的一些方法&#xff0c;这些方法可以帮助你更快更精确的搜寻到你需要的符合你要求的项目。 写文章不易&#xff0c;如果这一篇问文章对你有帮助&#xff0c;求点赞求收藏~ 好&#xff0c;下面我们直接进入正题——> 首先我…

RS485或RS232转ETHERCAT连接ethercat转换器

最近&#xff0c;生产管理设备中经常会遇到两种协议不相同的情况&#xff0c;这严重阻碍了设备之间的通讯&#xff0c;串口设备的数据不能直接传输给ETHERCAT。这可怎么办呢&#xff1f; 别担心&#xff0c;捷米JM-ECT-RS485/232来了&#xff01;这是一款自主研发的ETHERCAT从站…

多线程案例 | 单例模式、阻塞队列、定时器、线程池

多线程案例 1、案例一&#xff1a;线程安全的单例模式 单例模式 单例模式是设计模式的一种 什么是设计模式&#xff1f; 设计模式好比象棋中的 “棋谱”&#xff0c;红方当头炮&#xff0c;黑方马来跳&#xff0c;针对红方的一些走法&#xff0c;黑方应招的时候有一些固定的…

scrcpy2.0+实时将手机画面显示在屏幕上并用鼠标模拟点击2023.7.26

想要用AI代打手游&#xff0c;除了模拟器登录&#xff0c;也可以直接使用第三方工具Scrcpy&#xff0c;来自github&#xff0c;它是一个开源的屏幕镜像工具&#xff0c;可以在电脑上显示Android设备的画面&#xff0c;并支持使用鼠标进行交互。 目录 1. 下载安装2. scrcpy的高级…

【Vue3+Ts+Vite】配置滚动条样式

一、先看效果 二、直接上代码 <template><div class"main-container"><h1 v-for"index in 50" :key"index">这是home页面</h1></div> </template> <style lang"scss" scoped> .main-conta…

Failed to load local font resource:微信小程序加载第三方字体

加载本地字体.ttf 将ttf转换为base64格式&#xff1a;https://transfonter.org/ 步骤如下 将下载后的stylesheet.css 里的font-family属性名字改一下&#xff0c;然后引进页面里就行了&#xff0c;全局样式就放app.scss&#xff0c;单页面就引入单页面 注&#xff1a; .title…

目标检测之3维合成

现在有一系列的图片&#xff0c;图片之间可以按照z轴方向进行排列。图片经过了目标检测&#xff0c;输出了一系列的检测框&#xff0c;现在的需求是将检测框按类别进行合成&#xff0c;以在3维上生成检测结果。 思路&#xff1a;将图片按照z轴方向排列&#xff0c;以z轴索引作…

web流程自动化详解

今天给大家带来Selenium的相关解释操作 一、Selenium Selenium是一个用于自动化Web浏览器操作的开源工具和框架。它提供了一组API&#xff08;应用程序接口&#xff09;&#xff0c;可以让开发人员使用多种编程语言&#xff08;如Java、Python、C#等&#xff09;编写测试脚本&…

掌握无人机遥感数据预处理的全链条理论与实践流程、典型农林植被性状的估算理论与实践方法、利用MATLAB进行编程实践(脚本与GUI开发)以及期刊论文插图制作等

目录 专题一 认识主被动无人机遥感数据 专题二 预处理无人机遥感数据 专题三 定量估算农林植被关键性状 专题四 期刊论文插图精细制作与Appdesigner应用开发 近地面无人机植被定量遥感与生理参数反演 更多推荐 遥感技术作为一种空间大数据手段&#xff0c;能够从多时、多…

使用wxPython和pillow开发拼图小游戏(四)

上一篇介绍了使用本地图片来初始化游戏的方法&#xff0c;通过前边三篇&#xff0c;该小游戏的主要内容差不多介绍完了&#xff0c;最后这一篇来介绍下游戏用时的计算、重置游戏和关闭窗口事件处理 游戏用时的计算 对于游戏用时的记录&#xff0c;看过前几篇的小伙伴可能也发现…

Flutter:flutter_local_notifications——消息推送的学习

前言 注&#xff1a; 刚开始学习&#xff0c;如果某些案例使用时遇到问题&#xff0c;可以自行百度、查看官方案例、官方github。 简介 Flutter Local Notifications是一个用于在Flutter应用程序中显示本地通知的插件。它提供了一个简单而强大的方法来在设备上发送通知&#…

flask 点赞系统

dianzan.html页面 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>点赞系统</title> </head> <body><h2>这是一个点赞系统</h2><table border"1"><…

数据分析-关于指标和指标体系

一、电商指标体系 二、指标体系的作用 三、统计学中基本的分析手段

Python+OpenCV实现自动扫雷,挑战扫雷世界记录!

目录 准备 - 扫雷软件 实现思路 - 01 窗体截取 - 02 雷块分割 - 03 雷块识别 - 04 扫雷算法实现 福利&#xff1a;文末有Python全套资料哦 我们一起来玩扫雷吧。用PythonOpenCV实现了自动扫雷&#xff0c;突破世界记录&#xff0c;我们先来看一下效果吧。 中级 - 0.74秒 …

HC32F448-小华MCU

由于要开发和学习使用低成本MCU&#xff0c;这里记录下小华半导体HC32F448的手册参数 芯片官网&#xff08;HC32F448MCTI-LQFP80&#xff09; 小华半导体有限公司 (xhsc.com.cn) HC32F448 系列MCU是32位的ARM Cortex-M4微控制器。最高工作频率 200MHz&#xff0c;最大 256KB 的…

css3的filter图片滤镜使用

业务介绍 默认&#xff1a;第一个图标为选中状态&#xff0c;其他三个图标事未选中状态 样式&#xff1a;选中状态是深蓝&#xff0c;未选中状体是浅蓝 交互&#xff1a;鼠标放上去选中&#xff0c;其他未选中&#xff0c;鼠标离开时候保持当前选中状态 实现&#xff1a;目前…

2023级学姐上岸浙江大学MBA的备考经验分享

在分享我的浙大MBA提面经验之前&#xff0c;先给大家炫一波前段时间刚收到的浙大录取通知书。还有一个月的时间我就要去梦想中的殿堂学习了&#xff0c;而针对今年报考浙大的考生来说&#xff0c;杭州这边还有最后两次可以参加提面的机会&#xff0c;我们去年这届共招收新生526…

kettle 学习笔记

kettle 学习笔记 个人理解下载 / 安装kettle及测试环境准备kattle下载安装JDK安装配置MySQL安装配置 使用练习创建数据库连接转换练习 个人理解 ETL工具的一种&#xff0c;作用是将数据进行抽取&#xff0c;转换&#xff0c;应该是数据中心类型的项目用的比较多&#xff0c;将…

动态sql以及常用的标签

什么是动态sql&#xff1a; 指根据不同的条件生成不同的sql 搭建环境&#xff1a; 建表&#xff1a; create table blog( id varchar(50) not null comment 博客id, title varchar(100) not null comment 博客标题, author varchar(30) not null comment 博客作者, create_ti…