C语言(指针)7

                  Hi~!这里是奋斗的小羊,很荣幸各位能阅读我的文章,诚请评论指点,关注+收藏,欢迎欢迎~~     

                                💥个人主页:小羊在奋斗

                                💥所属专栏:C语言   

        本系列文章为个人学习笔记,在这里撰写成文一为巩固知识,二为同样是初学者的学友展示一些我的学习过程及心得。文笔、排版拙劣,望见谅。

                                        4、函数指针数组

                                        5、转移表

4、函数指针数组

        在上篇文章中我们又学了一个新的指针类型——函数指针类型,那学了函数指针,你是否还记得我们还学过指针数组呢?指针数组是一个数组,数组元素是相同类型的指针变量。那我们是不是也可以将相同类型的函数指针变量存到一个指针数组内呢?答案是可以的。

        存放函数指针变量的数组就叫做函数指针数组,函数指针数组出现的意义我就不多说了,跟其他类型数组的作用一样。

        来看下面的示例:

#include <stdio.h>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 (*pf1)(int, int) = add;//int (*pf2)(int, int) = sub;//int (*pf3)(int, int) = mul;//int (*pf4)(int, int) = div;int (*pf[4])(int, int) = { add, sub, mul, div };//函数指针数组return 0;
}

         可以看到,函数指针数组能避免我们需要多个相同函数指针类型变量创建时的繁琐。

        为了验证上面创建的函数指针数组,我们来遍历上面的数组,将数组内所有的函数指针指向的函数都使用一遍:

 

        可以看到我们通过数组内对应下标的元素找到相应的函数地址,再进行函数调用完成了相关的操作,得到了我们预期的结果。

        值得注意的是,不要忘了数组内存放的是相同类型的元素。如果这些函数的参数个数、参数类型、函数的返回值类型有差异,则不能存到同一个函数指针数组中。

5、转移表

        我们学了函数指针数组有什么用呢?函数指针数组的用途就是接下来我们要学习的转移表。

在介绍转移表之前,我们先来完成一个能实现计算器功能的小程序。

#include <stdio.h>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("*******      0.exit    ******\n");printf("*******  1.add  2.sub  ******\n");printf("*******  3.mul  4.div  ******\n");printf("*****************************\n");
}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;
}

        上面的程序还不能实现更多的计算功能,比如 &、^、|、~、>>、<< 等,想要增加更多的功能,我们不仅要写更多的自定义函数,还要增加更多的 case 语句,实现起来有点繁琐,完成后将得到一个代码量比较大的小程序。那有没有什么办法既能实现计算器的功能,代码量又没有那么大,想增加别的功能的时候也不麻烦呢?

        我们可以用刚学的函数指针数组来将四个自定义函数统一管理起来,通过数组下标访问对应的元素来实现函数调用,这样代码量就能大大减少。不仅如此,我们想增加某些功能的时候只需要做两步,第一步写好对应的自定义函数,第二步增大数组的大小后再将函数名存到数组中就完成了。我们去掉了 switch 语句用 if—else 分支来判断我们选择。具体代码实现如下:

#include <stdio.h>
#define N 5int 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("*******      0.exit    ******\n");printf("*******  1.add  2.sub  ******\n");printf("*******  3.mul  4.div  ******\n");printf("*****************************\n");
}int main()
{int input = 0;int x = 0;int y = 0;int ret = 0;int (*pf[N])(int, int) = { 0, add, sub, mul, div }; //多加一个数字0,为了让下标对应do                      // 0   1    2    3    4{menu();printf("请选择:");scanf("%d", &input);if (input > 0 && input < N)//使用if判断代替多条case语句{printf("请输入两个操作数:");scanf("%d %d", &x, &y);ret = pf[input](x, y);printf("结果是:%d\n", ret);}else if (0 == input){printf("退出计算器!\n");}else{printf("选择错误,请重新选择!\n");}} while (input);return 0;
}

        我们在上面的代码中创建了一个函数指针数组,通过数组来访问相应的函数,有一点跳转的意思。而我们上面代码中写的函数指针数组,就是一个转移表。 什么是转移表呢?

        在C语言中,转移表是一个包含指向函数变量指针的数组。通过使用转移表,可以实现一种灵活的方式来实现条件分支和函数调用。转移表通常用于实现状态机或分派表等功能。通过在转移表中存储函数指针可以根据条件或索引值来动态选择要执行的函数,从而提高代码的灵活性和可维护性。

         如果觉得我的文章还不错,请点赞、收藏 + 关注支持一下,我会持续更新更好的文章。

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

linux 任务管理(临时任务定时任务) 实验

目录 任务管理临时任务管理周期任务管理 任务管理 临时任务管理 执行如下命令添加单次任务&#xff0c;输入完成后按组合键Ctrl-D。 [rootopenEuler ~]# at now5min warning: commands will be executed using /bin/sh at> echo "aaa" >> /tmp/at.log at&g…

突破编程界限:探索AI编程新境界

文章目录 一、AI编程助手1.1 Baidu Comate智能代码助手1.2 阿里云 通义灵码 二、场景需求三、体验步骤3.1 官网下载3.2 手动下载 四、试用感受4.1 提示4.2 注释生成代码4.3 代码生成4.4 选中生成注释4.5 查看变更&新建文件4.6 调优建议4.7 插件使用 五、结尾推荐 一、AI编程…

【智能优化算法】蛛蜂优化算法(Spider Wasp Optimizer,SWO)

蛛蜂优化算法(Spider Wasp Optimizer,SWO)是期刊“ARTIFICIAL INTELLIGENCE REVIEW”&#xff08;中科院二区 IF11.6&#xff09;的2023年智能优化算法 01.引言 蛛蜂优化算法(Spider Wasp Optimizer,SWO)基于对自然界中雌性黄蜂的狩猎、筑巢和交配行为的复制。该算法具有多种…

下载文件名称乱码或变成了随机码

如图 后端是有正常返回附件名称的,浏览器开发工具中也正常显示了这个数据,但是下载下来的文件名称确实一堆随机码. 其实这个问题的原因是因为跨域 查看console: Refused to get unsafe header "content-disposition" 现象,后端传递到前端的fileName不能被识别,下载…

智慧安防系统:构建更安全的社区环境

随着科技的不断进步&#xff0c;人们的生活质量得到了显著提高。然而&#xff0c;与此同时&#xff0c;社会治安问题也日益凸显。为了维护社会的和谐稳定&#xff0c;提高人们的生活安全感&#xff0c;智慧安防系统应运而生。本文将为您详细介绍智慧安防系统的项目背景、需求分…

安卓悬浮窗----可移动的悬浮窗

目录 前言一、添加对悬浮窗功能的支持二、通过service实现悬浮窗2.1 窗口属性和标志2.2 窗口移动 三、完整代码 前言 记录一下基础的悬浮窗实现&#xff0c;分为几个重要的点进行阐述。 一、添加对悬浮窗功能的支持 app要实现悬浮窗功能&#xff0c;首先app要添加对悬浮窗功…

Properties配置文件和源码

先对测试类进行get方法复写得到getReqType 判断caseinfo等于get时&#xff0c;就是get请求&#xff0c;反之就不是 这里的url和param都是xxx代替&#xff0c;如果直接写内容&#xff0c;每次都会请求 三目运算优化 为什么要用配置文件 test里时url,可以将ip和端口写在配置文…

AD中在DRC后如何显示详细错误(冲突)细节

最近在使用AD过程中出现了一个问题&#xff0c;在这里做一下记录&#xff0c;以便之后查询。 在我进行DRC后&#xff0c;出现了错误&#xff0c;但是当我去放大查找具体原因时发现以前有的细节现在却没有显示了&#xff0c;如下图所示&#xff0c;放大后并未显示详细的错误信息…

【解决】Unity Build 应用程序运行即崩溃问题

开发平台&#xff1a;Unity 2021.3.7f1c1   一、问题描述 编辑器 Build 工程结束&#xff0c;但控制台 未显示 Build completed with a result of Succeeded [时间长度] 信息。该情况下打包流程正常&#xff0c;但应用程序包打开即崩溃。   二、问题测试记录 测试1&#xf…

40V/300mA快速瞬态低压差线性稳压器替代ADP7142

概述(替代ADP7142/LT1962/LT1521/LT3060) PCD4900 是一款 CMOS、低压差&#xff08;LDO&#xff09;线性稳压器&#xff0c;采用 1.9V 至 40V 电源供电&#xff0c;最大输出电流为 300 mA。这款高输入电压 LDO 适用于调节 36V 至 1.2V 供电的高性能模拟和混合信号电路。该器件…

Python实现麦克风录音保存到wav

功能展示&#xff1a; 运行环境&#xff1a; Python: 3.10.4 64-bit 操作系统&#xff1a; 截图环境&#xff1a;win10 64-bit 视频录屏环境&#xff1a;win10 64-bit 功能说明&#xff1a; 点击界面开始按钮开始录音&#xff0c;点击停止按钮结束录音。 源码文件列表&…

CodeGeeX 智能编程助手 6 项功能升级,在Visual Studio插件市场霸榜2周!

CodeGeeX是支持适配Visual Studio 2019的唯一一款国产智能辅助编程工具&#xff0c;已经在Visual Studio趋势上霸榜2周&#xff01; CodeGeeX v1.0.4版本上线Visual Studio插件市场&#xff0c;带来了多项新功能和性能优化&#xff0c;提升编程体验。 新功能亮点速览&#xf…