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

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

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

相关文章:

C语言(指针)7

Hi~&#xff01;这里是奋斗的小羊&#xff0c;很荣幸各位能阅读我的文章&#xff0c;诚请评论指点&#xff0c;关注收藏&#xff0c;欢迎欢迎~~ &#x1f4a5;个人主页&#xff1a;小羊在奋斗 &#x1f4a5;所属专栏&#xff1a;C语言 本系列文章为个人学习笔记&#x…...

线程纵横:C++并发编程的深度解析与实践

hello &#xff01;大家好呀&#xff01; 欢迎大家来到我的Linux高性能服务器编程系列之《线程纵横&#xff1a;C并发编程的深度解析与实践》&#xff0c;在这篇文章中&#xff0c;你将会学习到C新特性&#xff0c;并发编程&#xff0c;以及其如何带来的高性能的魅力&#xff0…...

在阿里云服务器上安装MySQL

目录 一、先卸载不需要的环境 1.关闭MySQL服务 2.查看安装包以及卸载安装包 3.依次卸载所有包 4. 获取mysql官⽅yum源 二、安装&#xff08;密钥过期解决方法&#xff09; 三、启动并进入 关于MySQL MySQL是一个广泛使用的开源关系型数据库管理系统&#xff08;RDBMS&…...

国标GB28181协议EasyCVR视频汇聚平台获取设备录像仅展示部分片段的原因排查

国标GB28181协议EasyCVR安防平台可以提供实时远程视频监控、视频录像、录像回放与存储、告警、语音对讲、云台控制、平台级联、磁盘阵列存储、视频集中存储、云存储等丰富的视频能力&#xff0c;平台支持7*24小时实时高清视频监控&#xff0c;能同时播放多路监控视频流&#xf…...

Java的类和对象(一)—— 初始类和对象,this关键字,构造方法

前言 从这篇文章开始&#xff0c;我们就进入到了JavaSE的核心部分。这篇文章是Java类和对象的第一篇&#xff0c;主要介绍类和对象的概念&#xff0c;this关键字以及构造方法~~ 什么是类&#xff1f;什么是对象&#xff1f; 学过C语言的老铁们&#xff0c;可以类比struct自定义…...

富格林:曝光虚假套路规避亏损

富格林指出&#xff0c;在现货黄金市场中&#xff0c;交易时间很充足投资机会也多的是&#xff0c;但为什么还是有人亏损甚至爆仓呢&#xff1f;其实导致这种情况&#xff0c;是因为有一些投资者不知道其中的虚假套路&#xff0c;很容易就一头栽进去了。要规避虚假套路带来的亏…...

数据源网站分享

1. 国家统计局&#xff1a; http://www.stats.gov.cn/提供国家宏观经济数据 2. 工业和信息化部&#xff1a; http://www.miit.gov.cn 发布工业运行及信息化相关数据 3. 中国人民银行&#xff1a; http://www.pbc.gov.cn/ 提供金融市场政策及运行相关数据 4. 国家金融监督…...

Flutter 中的 CupertinoAlertDialog 小部件:全面指南

Flutter 中的 CupertinoAlertDialog 小部件&#xff1a;全面指南 在Flutter中&#xff0c;CupertinoAlertDialog是用于在iOS风格的应用中显示警告或提示信息的模态对话框。它以其圆角卡片和模糊背景为特点&#xff0c;为用户提供了一个简洁而直观的交互界面。CupertinoAlertDi…...

【RAG 论文】UPR:使用 LLM 来做检索后的 re-rank

论文&#xff1a;Improving Passage Retrieval with Zero-Shot Question Generation ⭐⭐⭐⭐ EMNLP 2022, arXiv:2204.07496 Code: github.com/DevSinghSachan/unsupervised-passage-reranking 论文&#xff1a;Open-source Large Language Models are Strong Zero-shot Query…...

安全风险 - 如何解决 setAccessible(true) 带来的安全风险?

可能每款成熟的金融app上架前都会经过层层安全检测才能执行上架&#xff0c;所以我隔三差五就能看到安全检测报告中提到的问题&#xff0c;根据问题的不同级别&#xff0c;处理的优先级也有所不同&#xff0c;此次讲的主要是一个 “轻度问题” &#xff0c;个人认为属于那种可改…...

创建继承自QObject的线程:一个详细指南

目录标题 步骤 1&#xff1a;创建一个新的QObject子类步骤 2&#xff1a;在新的QObject子类中实现工作代码步骤 3&#xff1a;创建一个新的QThread对象步骤 4&#xff1a;管理线程的生命周期步骤 5&#xff1a;处理线程间通信结论 在Qt中&#xff0c;线程可以通过继承QThread类…...

java项目之智慧图书管理系统设计与实现(springboot+vue+mysql)

风定落花生&#xff0c;歌声逐流水&#xff0c;大家好我是风歌&#xff0c;混迹在java圈的辛苦码农。今天要和大家聊的是一款基于springboot的智慧图书管理系统设计与实现。项目源码以及部署相关请联系风歌&#xff0c;文末附上联系信息 。 项目简介&#xff1a; 智慧图书管理…...

分享一些人生道理,希望能对大家有所帮助!

1. 别总想出风头&#xff0c;炫耀就是深渊&#xff0c;贪心就是毁灭&#xff0c;人性的恶一旦被激发&#xff0c;后果不堪设想。 2. 戒取怨之言&#xff1a;不要说招人怨恨的话&#xff0c;播下使人怨恨的种子。 3. 学会感恩&#xff0c;因为感恩能够让你更加幸福。 4. 玉碎不能…...

【设计模式】JAVA Design Patterns——Abstract-document(抽象文档模式)

&#x1f50d; 目的 使用动态属性&#xff0c;并在保持类型安全的同时实现非类型化语言的灵活性。 &#x1f50d; 解释 抽象文档模式使您能够处理其他非静态属性。 此模式使用特征的概念来实现类型安全&#xff0c;并将不同类的属性分离为一组接口 真实世界例子 考虑由多个部…...

5.13网络编程

只要在一个电脑中的两个进程之间可以通过网络进行通信那么拥有公网ip的两个计算机的通信是一样的。但是一个局域网中的两台电脑上的虚拟机是不能进行通信的&#xff0c;因为这两个虚拟机在电脑中又有各自的局域网所以通信很难实现。 socket套接字是一种用于网络间进行通信的方…...

那些年使用过的UA头

一些WAF会根据扫描器UA头进行屏蔽 UA头 在sqlmap 中可以使用 –random-agnet /xx.txt 来更换UA头 Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.95 Safari/537.36 OPR/26.0.1656.60 Opera/8.0 (Windows NT 5.1; U; en) Mozi…...

IT技术产品:开发者极为重要的思维习惯

1、特色内容预告 1、我用敏捷开发思维&#xff0c;提高工作效率。 2、我用代码批判思维&#xff0c;逐渐让自己的作品变得无可挑剔。 3、我是一个顶级程序员&#xff0c;是哪些重要的专业习惯&#xff0c;让我如此优秀&#xff1f; 2、可以免费获取到的IT资源 1、《软件工程&a…...

软件产品质量模型及其子特性

一、功能性 子特性&#xff1a; 功能的完备性 功能正确性 功能适合性 功能性的依从性 二、性能效率 子特性&#xff1a; 时间特性 资源利用性 容量 性能效率的依从性 三、兼容性 子特性&#xff1a; 共存性 互操作性 兼容性的依从性 四、易用性 子特性&#xff1a; 可辨识性…...

神经网络中的误差反向传播(Backpropagation)方法理解

想象一下&#xff0c;神经网络就像是一个复杂的迷宫&#xff0c;里面有许多交叉路口&#xff08;神经元&#xff09;&#xff0c;每个路口都有指示牌告诉你往哪个方向走&#xff08;权重&#xff09;&#xff0c;而你的目标是找到从入口到出口的最佳路径&#xff0c;使得从起点…...

Day 32 shell变量及运算

一&#xff1a;变量概述 1.什么是变量 ​ 变量来源于数学&#xff0c;是计算机语言中能储存计算结果或能表示值的抽象概念 ​ 变量可以通过变量名访问&#xff0c;在指令式语言中&#xff0c;变量通常是可变的&#xff1b;在某些条件下也是不可变的 2.变量的规则 ​ 命名只…...

【Lovable开发者私藏资源包】:含官方未公开API文档、调试插件源码与CI/CD配置清单

更多请点击&#xff1a; https://kaifayun.com 第一章&#xff1a;Lovable应用开发完整教程 Lovable 是一个面向现代 Web 应用的轻量级响应式框架&#xff0c;专为构建高交互性、可访问性强且易于维护的单页应用&#xff08;SPA&#xff09;而设计。它不依赖虚拟 DOM&#xff…...

MapTRV2 部署训练与测试(踩坑版本)

1. 背景 目录 1. 背景 1.1 结果 1.1.1 过程截图 存在的坑 安装环境 踩坑记录 过程记录 requirements.txt 设置调试的launch.json数据 合成视频脚本 跑通了MapTRV1 ,想继续跑通MapTRV2,安装运行的时候都存在问题,先从网上找了一些相关的教程,发现教程需要收费,作为白嫖党怎…...

视频高清直播点播/音视频点播/云点播/云直播EasyDSS交互升级解锁大型活动直播新体验

在数字化时代&#xff0c;大型活动直播已从“可选”变为“必需”&#xff0c;无论是政企发布会、行业峰会&#xff0c;还是跨区域学术论坛&#xff0c;都需要一套兼顾稳定、安全与高效的直播解决方案。EasyDSS私有化视频会议系统凭借高并发、低延迟的核心优势站稳市场&#xff…...

波兰市场语音本地化迫在眉睫,ElevenLabs波兰语支持深度评测:WAV质量、时延、重音准确率98.7%实测数据曝光

更多请点击&#xff1a; https://kaifayun.com 第一章&#xff1a;波兰市场语音本地化战略紧迫性分析 波兰作为欧盟第六大经济体和中东欧数字化转型先锋&#xff0c;其语音技术采纳率正以年均23.7%的速度攀升。截至2024年Q2&#xff0c;波兰智能音箱渗透率达38%&#xff0c;而…...

协议转换网关与数据采集网关的区别与差异

摘要在工业自动化、物联网、智能建筑等领域中&#xff0c;“协议转换”和“数据采集网关”是两个常被提及但容易混淆的概念。它们虽有关联&#xff0c;却扮演着不同的角色。理解其核心差异对于构建高效、可靠的数据通信系统至关重要。1.核心定义&#xff1a;本质差异1.1协议转换…...

3大功能让Mac永不停歇:自动鼠标移动器的终极指南

3大功能让Mac永不停歇&#xff1a;自动鼠标移动器的终极指南 【免费下载链接】automatic-mouse-mover a minimalistic go library/app to keep your mac active and alive 项目地址: https://gitcode.com/gh_mirrors/au/automatic-mouse-mover 你是否曾在重要视频会议中…...

Onekey Steam清单下载工具:快速获取游戏清单的完整指南

Onekey Steam清单下载工具&#xff1a;快速获取游戏清单的完整指南 【免费下载链接】Onekey Onekey Steam Depot Manifest Downloader 项目地址: https://gitcode.com/gh_mirrors/one/Onekey Onekey是一款专业的开源Steam Depot清单下载工具&#xff0c;能够直接连接Ste…...

Honey Select 2终极增强补丁:100+插件一键安装完整指南

Honey Select 2终极增强补丁&#xff1a;100插件一键安装完整指南 【免费下载链接】HS2-HF_Patch Automatically translate, uncensor and update HoneySelect2! 项目地址: https://gitcode.com/gh_mirrors/hs/HS2-HF_Patch 还在为《Honey Select 2》的语言障碍和功能限…...

GRBL-Plotter完全指南:从创意到实物的智能数控转换方案

GRBL-Plotter完全指南&#xff1a;从创意到实物的智能数控转换方案 【免费下载链接】GRBL-Plotter A GCode sender (not only for lasers or plotters) for up to two GRBL controller. SVG, DXF, HPGL import. 6 axis DRO. 项目地址: https://gitcode.com/gh_mirrors/gr/GR…...

解锁SD-PPP:将AI绘画能力无缝融入Photoshop工作流

解锁SD-PPP&#xff1a;将AI绘画能力无缝融入Photoshop工作流 【免费下载链接】sd-ppp A Photoshop AI plugin 项目地址: https://gitcode.com/gh_mirrors/sd/sd-ppp 你是否曾经在Photoshop中创作时&#xff0c;突然需要一个AI生成的元素来完善设计&#xff0c;却不得不…...