知识联合——函数指针数组

news2024/12/24 3:33:49

前言:小伙伴们又见面啦,今天我们来讲解一个将函数,指针,数组这三个C语言大将整合在一起的知识——函数指针数组。同时来告诉小伙伴们我们上一篇文章的伏笔——函数指针的具体用法


目录

一.什么是函数指针数组

二.函数指针数组的形式

三.函数指针数组的使用

四.总结


一.什么是函数指针数组

我们前边已经学习过了函数指针,也学习过指针数组,那么什么是函数指针数组呢???

这里要告诉大家,只要哪个名词在最后,就说明它的本质是这个名词,所以函数指针数组的本质,就是一个数组。而这个数组存放的是什么东西呢——函数指针

二.函数指针数组的形式

OK,那么已经知道了函数指针数组是什么东西之后,我们来思考一下怎么来表示它。

这个其实简单,它是一个数组,是一个存放函数指针类型的数组,我们参考之前讲过的函数指针和指针数组的表示方法,得出函数指针数组的形式为:

void (* arr[])(void ,void) = { };

 arr[]代表它是数组把arr[]去掉,剩下的void (*)(void , void)则表示其存放的类型为函数指针

三.函数指针数组的使用

OK,现在我们已经清楚了函数指针数组的形式,那么该怎么具体使用它呢???

假设我们现在要写一个代码模拟实现计算器的加、减、乘、除

#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("*******   1.Add   2.Sub   ******\n");
	printf("*******   3.Mul   4.Div   ******\n");
	printf("*******   0.exit          ******\n");
	printf("********************************\n");
}
int main()
{
	int a;
	int b;
	int input;
	int ret;
	do {
		Menu();
		printf("请选择->:");
		scanf("%d", &input);
		switch (input)
		{
		case 1:
			printf("请输入两个运算数:");
			scanf("%d %d", &a, &b);
			ret = Add(a, b);
			printf("%d\n", ret);
			break;
		case 2:
			printf("请输入两个运算数:");
			scanf("%d %d", &a, &b);
			ret = Sub(a, b);
			printf("%d\n", ret);
			break;
		case 3:
			printf("请输入两个运算数:");
			scanf("%d %d", &a, &b);
			ret = Mul(a, b);
			printf("%d\n", ret);
			break;
		case 4:
			printf("请输入两个运算数:");
			scanf("%d %d", &a, &b);
			ret = Div(a, b);
			printf("%d\n", ret);
			break;
		case 0:
			printf("退出计算器\n");
			break;
		default:
			printf("输入错误,请重新输入:\n");
			break;
		}
	} while (input);
	return 0;
}

我们将四则运算写成函数形式,并通过do-while循环和switch-case语句来实现计算器的加、减、乘、除功能。

但是我们能看出,这样的写法是不是太过于繁琐,很多语句都重复使用了很多次。

我们已经把四则运算写成了函数,而且我们也知道怎么用指针调用函数,那么我们现在是不是可以考虑:将这些函数全放在一个数组中,在通过数组去调用是不是更加的简洁方便呢???

下面我们就用函数指针数组来实现一下:

#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("*******   1.Add   2.Sub   ******\n");
	printf("*******   3.Mul   4.Div   ******\n");
	printf("*******   0.exit          ******\n");
	printf("********************************\n");
}
int main()
{
	int a;
	int b;
	int input;
	int ret;
	int(*Calarr[])(int, int) = { NULL,&Add,&Sub,&Mul,&Div };
	do {
		Menu();
		printf("请选择->:");
		scanf("%d", &input);
		if (input == 0)
		{
			printf("退出计算器\n");
		}
		else if (input >= 1 && input <= 4)
		{
			printf("请输入两个操作数:");
			scanf("%d %d", &a, &b);
			ret = Calarr[input](a, b);//调用
			printf("%d\n", ret);
		}
		else
		{
			printf("输入错误,请重新输入:\n");
		}
	} while (input);
	return 0;
}

来看用函数指针数组来实现。

我们将四个函数的地址都通过函数指针来保存在数组中,但是我们知道,数组的下标是从0开始的,那么我们希望选择的数字和计算器选择数达成一致,便在数组下标为0的位置放一个NULL空指针。这时候我们的输入数input就可以帮助我们从数组中调用对应的函数来实现运算。

这样的代码是不是比上边的简单整洁多了。

当我们想要同时管理多个函数时,便可以使用函数指针数组,这便是函数指针数组的实际用法。

四.总结

函数指针数组有关的知识和用法的讲解到这里就结束啦。其实这部分内容还是很好理解哒。

最后不要忘记一键三连呀!

我们下期再见!

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Java】全套云HIS(医院信息管理系统)源码包含EMR、LIS

云HIS系统简介 SaaS模式Java版云HIS系统源码&#xff0c;在公立二甲医院应用三年&#xff0c;经过多年持续优化和打磨&#xff0c;系统运行稳定、功能齐全&#xff0c;界面布局合理、操作简便。 1、融合B/S版电子病历系统&#xff0c;支持电子病历四级&#xff0c;HIS与电子病…

linux下centos7升级python版本

由于项目需要使用爬虫&#xff0c;爬虫框架支撑3.8以上版本。而linux自带的python版本是2.7.*&#xff0c;所以需要升级python版本至3.8 键脚本安装Python3.6-Python3.10 bash <(curl -sSL https://raw.githubusercontent.com/midoks/choose-linux-python/main/install.sh…

MySql入门到精通,优化,

Mysql概述 1.数据库相关概念 1.数据库&#xff1a;数据存储的仓库 2.数据库管理系统&#xff1a;操作和管理数据库的大型软件。&#xff08;DBMS&#xff09; 3.SQL&#xff1a;操作关系型数据库的编程语言&#xff0c;是一套标准。 都要使用SQL操作语言&#xff08;统一标准…

左神高级进阶班3(TreeMap顺序表记录线性数据的使用, 滑动窗口的使用,前缀和记录结构, 可能性的舍弃)

目录 【案例1】 【题目描述】 【思路解析】 【代码实现】 【案例2】 【题目描述】 【思路解析】 【代码实现】 【案例3】 【题目描述】 【思路解析】 【代码实现】 【案例4】 【题目描述】 【思路解析】 【代码实现】 【案例1】 【题目描述】 【思路解析】 这里…

vue-cli init vue3

安装 cli npm i -g vue/cli4.5.13查看版本&#xff1a;vue -V升级版本&#xff1a;npm update -g vue/cli 初始化项目 vue create 项目名称 > - ? Please pick a preset:Default ([Vue 2] babel, eslint)Default (Vue 3) ([Vue 3] babel, eslint) > Manually selec…

什么是HTML5中的Web存储API,包括LocalStorage和SessionStorage?它们的区别是什么?

聚沙成塔每天进步一点点 ⭐ 专栏简介⭐ Web存储API和区别⭐ LocalStorage&#xff08;本地存储&#xff09;⭐ SessionStorage&#xff08;会话存储&#xff09;⭐ 区别⭐ 写在最后 ⭐ 专栏简介 前端入门之旅&#xff1a;探索Web开发的奇妙世界 欢迎来到前端入门之旅&#xff0…

HTTP状态码301(永久重定向)不同Web服务器的配置方法

文章目录 301状态码通常在那些情况下使用301永久重定向配置Nginx配置301永久重定向Windows配置IIS301永久重定向PHP下的301重定向Apache服务器实现301重定向 301重定向是否违反相关法规&#xff1f;推荐阅读 当用户或搜索引擎向服务器发出浏览请求时&#xff0c;服务器返回的HT…

腾讯轻联:带你创造属于自己的AI小助手

陈老老老板&#x1f934; &#x1f9d9;‍♂️本文专栏&#xff1a;生活&#xff08;主要讲一下自己生活相关的内容&#xff09;生活就像海洋,只有意志坚强的人,才能到达彼岸。 &#x1f9d9;‍♂️本文简述&#xff1a;参加腾讯全球数字生态大会&#xff0c;了解到腾讯轻联企业…

LLM(一)| 百川智能baichuan7B、13B、53B以及baichuan2总结

之前在文章baichuan-53B VS ChatGLM-6B对比中做过百川大模型53B和ChatGLM 6B模型的效果对比&#xff0c;由于百川大模型的内测模型是53B&#xff0c;因此本次对比参数量差异较大&#xff0c;但仍然可以看到两个模型的效果。百川大模型在benchmark上有超越ChatGLM和LLaMA的迹象&…

《DevOps实践指南》- 读书笔记(六)

DevOps实践指南 Part 4 第二步 &#xff1a;反馈的技术实践17. 将假设驱动的开发和A/B测试融入日常工作17.1 A/B 测试简史17.2 在功能测试中集成 A/B 测试17.3 在发布中集成 A/B 测试17.4 在功能规划中集成 A/B 测试17.5 小结 18. 建立评审和协作流程以提升当前工作的质量18.1 …

内存映射-

内存映射区不会堵塞 父子进程之间通信 /*#include <sys/mman.h>void *mmap(void *addr, size_t length, int prot, int flags, int fd, off_t offset);作用&#xff1a;将一个文件或者设备的数据映射到内存中参数&#xff1a;- addr&#xff1a;NULL- length&#xff1…

计算机毕设 flink大数据淘宝用户行为数据实时分析与可视化

文章目录 0 前言1、环境准备1.1 flink 下载相关 jar 包1.2 生成 kafka 数据1.3 开发前的三个小 tip 2、flink-sql 客户端编写运行 sql2.1 创建 kafka 数据源表2.2 指标统计&#xff1a;每小时成交量2.2.1 创建 es 结果表&#xff0c; 存放每小时的成交量2.2.2 执行 sql &#x…

双喜临门 | 开源网安SFuzz在谷歌FuzzBench中夺魁,并获得CWE国际认证

​近日&#xff0c;开源网安模糊测试平台SFuzz于上半年推出的“灰盒代码模糊测试系统”&#xff0c;经过数月的不断调优&#xff0c;在谷歌的FuzzBench基准测试中脱颖而出&#xff0c;荣登榜首。此外&#xff0c;SFuzz还成功获得了CWE国际兼容性认证&#xff0c;进一步巩固了其…

警报:新的 Kubernetes 漏洞可对 Windows 端点实施远程攻击

不久前&#xff0c;研究人员在 Kubernetes 中发现的三个可被利用并相互关联的高危安全漏洞&#xff0c;这些漏洞可在集群内的 Windows 端点上以提升权限的方式实现远程代码执行。 这些漏洞被标记为 CVE-2023-3676、CVE-2023-3893 和 CVE-2023-3955&#xff0c;CVSS 评分为 8.8…

第73步 时间序列建模实战:多步滚动预测 vol-1(以决策树回归为例)

基于WIN10的64位系统演示 一、写在前面 上一期&#xff0c;我们讲了单步滚动预测&#xff0c;一次只预测一个值。 既然有单步&#xff0c;有没有多步呢&#xff1f;那肯定有&#xff0c;这一期来介绍多步滚动预测。 然而&#xff0c;多步滚动模型也可以有不同的步骤&#x…

Mac电脑运行太卡怎么办?

许多小伙伴使用Mac后都反馈电脑不如想象中的流畅&#xff0c;甚至有点卡顿的现象&#xff0c;原因可能是因为无用的应用占据了过多的内存&#xff0c;或者是系统盘垃圾过多&#xff0c;导致的电脑卡顿现象。 今天小编教给大家几招&#xff0c;让自己的Mac能够一键重生&#xf…

创造性地解决冲突

1、冲突的根本原因是矛盾双方存在不可调和的目标冲突。 2、要知己知彼&#xff1a; 知己&#xff1a;就是对自己的问题、需求进行客观定义&#xff0c;说明需求和问题的意义或价值、阐述解决方案和期望效果&#xff1b; 知彼&#xff1a;站在对方立场&#xff0c;深挖对方真…

探索AIGC人工智能(Midjourney篇)(四)

文章目录 Midjourney模特换装 Midjourney制作APP图标 Midjourney网页设计 Midjourney如何生成IP盲盒 Midjourney设计儿童节海报 Midjourney制作商用矢量插画 Midjourney设计徽章 Midjourney图片融合 Midjourney后缀参数 Midjourney模特换装 关键词生成模特照片 中国女性模特的…

虚拟机Ubuntu操作系统常用终端命令(3)(详细解释+详细演示)

本篇概要 本篇讲述了Ubuntu操作系统常用的几个功能&#xff0c;即修改文件权限、修改文件属性、可执行脚本、虚拟机网络、FTP服务器、SSH服务器、VIM等方面的知识。希望能够得到大家的支持。 文章目录 本篇概要1.修改文件权限2.修改文件属主3.可执行脚本3.1要点与细节3.2shell…

河北吉力宝打造步力宝智能康养鞋,助力健康中国行

据国家统计局数据&#xff0c;2022年我国总人口减少85万人&#xff0c;正式迈入人口负增长时代。人口老龄化程度的进一步加深令劳动力愈加不足&#xff0c;加之“421”的家庭结构&#xff0c;仅依靠政府性养老事业已难以支撑。 当老年群体对品质消费越来越看重时&#xff0c;康…