指针进阶2

紧接着我们上一讲,指针进阶1,让我们趁热打铁,学习一下指针进阶2~

一,函数指针数组

由第一讲我们可以知道:(由于我们知道数组是存放一种类型的多个元素,若两个函数指针相同的话,那我们是不是可以都存放在数组里呢?)

 

让我们来看一下函数指针的用途:

 让我们先看一个例子:(计算器的四则运算)

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 {
		meau();
		printf("请选择:>");
		scanf_s("%d", &input);
		switch (input) {
		case 1:printf("请输入两个操作数");
			scanf_s("%d%d", &x, &y);
			ret = Add(x, y);
			printf("%d\n", ret);
			break;
		case 2:printf("请输入两个操作数");
			scanf_s("%d%d", &x, &y);
			ret = Sub(x, y);
			printf("%d\n", ret);

			break;
		case 3:
			printf("请输入两个操作数");
			scanf_s("%d%d", &x, &y);
			printf("%d\n", ret);
			ret = Mul(x, y);
			break;
		case 4:
			printf("请输入两个操作数");
			scanf_s("%d%d", &x, &y);
			printf("%d\n", ret);
			ret = Div(x, y); 
			break;
		case 0:printf("退出游戏"); break;
		default:printf("选择错误");
			break;
		}
	} while (input);
}

当我们想要实现两位操作数的&&  ||   &   |   %,我们发现我们Switch语句会越来越多,代码会发生冗余,这时候为了计算机的方便性,我们需要改造代码;那我们如何改造呢?

这时候我们可以使用函数指针数组,数组存放  +-*/的函数的地址

//计算器(函数指针数组)-----转移表

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 {
		meau();
		printf("请选择:>");
		scanf_s("%d", &input);
	int(*pf[])(int,int)={NULL,Add,Sub,Div,Mul};

 //                       0    1   2   3    4
    if(0==input)
        {
            printf("退出游戏“”);

		}
    else if(1>=input&&input<=4)
        {
        prinf("输入两个操作数:);
        }
    else{
            printf("重新输入");
	    } while (input);
}

当我们看一下改造的代码,这种写法不会增加Switch的语句啰嗦,但是有个小小的缺陷,即就是返回函数类型的时候,必须都为int类型,如果类型不同,则不能使用这种方法了

 二,回调指针(依赖函数指针)

 eg:用计算器的例子来实现

 通过这个图片,我们可以看到 中间的calc函数像是一个中转站

大家可以看到,加减乘除的函数我们并没有直接去调用,而是把图左边的case 1等中calc()中的这些函数放到中间的calc函数,在calc函数内部使用的函数指针去调用 图右边 的Add Sub等函数,此时ret就是回调函数

让我们看一下回调函数的案例:qsort

 让我们回顾一下冒泡排序:

 我们可以知道,这个代码函数只能排序固定类型的数据,那我们要是想排序不同类型的数据,这该怎么办呢?这个时候我们使用qsort函数

 

让我们测试下qsort排序结构体类型:

 1按照年龄比较:

 2,按照名字比较

好啦~指针进阶2我们就讲到这里啦,谢谢大家 

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

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

相关文章

LabVIEW直流电机转速检测与控制

研究了使用LabVIEW软件和ELVIS实验平台来检测和控制直流电机的转速。通过集成光电传感器和霍尔传感器&#xff0c;实现了对电机转速的精确测量和调节。 系统组成&#xff1a;系统由NI ELVIS实验平台、光电传感器、霍尔传感器和直流电机组成。通过这些硬件元件&#xff0c;系统…

Redis 安装 redistimeseries.so(时间序列数据类型)教程

配置步骤 1.下载 redistimeseries.so 文件 2.在 redis.conf 中增加配置 loadmodule /home/chenjian/redis-lib/RedisTimeSeries/redistimeseries.so DUPLICATE_POLICY LAST3.重启 Redis 服务 4.连接客户端&#xff0c;测试 RedisTimeSeries 相关命令&#xff0c;下图表明 R…

blender关于几何接近(geometry proximity)节点的理解

如图&#xff0c;可以见到&#xff0c;我输入了一个立方体&#xff0c;一个圆锥体&#xff0c;为了便于区分 &#xff0c;将原生的立方体与圆锥转为了曲线&#xff0c;而进行了几何接近处理的网格不进行此转换。 几何接近的输入端&#xff0c;分为target&#xff08;目标&…

STM32 CAN接口的配置和使用方法详解

STM32 微控制器提供了多个系列和型号&#xff0c;不同型号的芯片可能有不同的CAN&#xff08;控制器区域网络&#xff09;接口。在这里&#xff0c;我们以STM32F4系列为例来详细介绍CAN接口的配置和使用方法。 ✅作者简介&#xff1a;热爱科研的嵌入式开发者&#xff0c;修心和…

学习MySQL仅此一篇就够了(视图)

视图 介绍及基本语法 视图&#xff08;View&#xff09;是一种虚拟存在的表。视图中的数据并不在数据库中实际存在&#xff0c;行和列数据来自定义视 图的查询中使用的表&#xff0c;并且是在使用视图时动态生成的。 通俗的讲&#xff0c;视图只保存了查询的SQL逻辑&#xf…

STM32——看门狗

STM32——看门狗 1.独立看门狗IWDG 独立看门狗介绍 什么是看门狗&#xff1f; 在由单片机构成的微型计算机系统中&#xff0c;由于单片机的工作常常会受到来自外界电磁场的干扰&#xff0c;造成程序的跑飞&#xff0c;而陷入死循环&#xff0c;程序的正常运行被打断&#x…

你应该仅仅把useMemo作为性能优化的手段

文章概叙 本文主要通过几个简单的例子&#xff0c;讲解下useMemo这个hook&#xff0c;给诸君参考&#xff0c;也是给我自己做一个记录 关于useMemo useMemo是一个React Hook&#xff0c;它在每次重新渲染的时候能够缓存计算的结果。 相比于其他很常用的hook&#xff0c;如u…

父元素flex:1 高度却被子元素撑开的问题

问题 当父元素设置了flex: 1; 的情况下&#xff0c;想在其中子元素超出父元素高度的情况下&#xff0c;产生滚动条&#xff0c;在父元素区域滚动。由于子元素高度不固定&#xff0c;故父元素设置为display: flex; flex-direction: column; 子元素设置flex: 1; overflow: auto;…

MySQL事务和SQL优化

目录 1 什么是事务 2 事务的特征 3 MySQL使用事务 实现 示例 4 事务的隔离级别 幻读 解决方法 脏读 不可重复读 幻读和不可重复读两者区别 事物的隔离级别 5 数据库优化 5.1 影响性能因素的优化 服务优化 应用优化 5.2 谁参与优化 5.3 系统优化 软件优化 硬件优…

落地PC ,AI的“iPhone时刻”要来了?

在AI技术浪潮持续翻涌的背景下&#xff0c;近段时间&#xff0c;不断有声音强调“2024年将是AIPC元年”。 为了奔赴这一可以预见的未来&#xff0c;产业链上下游的企业也“干劲十足”。品牌商方面&#xff0c;2024年的国际消费电子展&#xff08;CES&#xff09;上&#xff0c…

贪吃蛇项目

引言&#xff1a; 本文章使用C语言在Windows环境的控制台中模拟实现经典小游戏贪吃蛇。 实现基本功能&#xff1a; 1.贪吃蛇地图绘制。 2.蛇吃食物的功能&#xff08;上、下、左、右方向键控制蛇的动作&#xff09; 3.蛇撞墙死亡 4.蛇咬到自己死亡 5.计算得分 6.蛇加速…

基于springboot原创歌曲分享平台源码和论文

随着信息技术和网络技术的飞速发展&#xff0c;人类已进入全新信息化时代&#xff0c;传统管理技术已无法高效&#xff0c;便捷地管理信息。为了迎合时代需求&#xff0c;优化管理效率&#xff0c;各种各样的管理平台应运而生&#xff0c;各行各业相继进入信息管理时代&#xf…

Coppeliasim倒立摆demo

首先需要将使用Python远程控制的文件导入到文件夹&#xff0c;核心是深蓝色的三个文件。 本版本为4.70&#xff0c;其文件所在位置如下图所示&#xff0c;需要注意的是&#xff0c;目前不支持Ubuntu22的远程api&#xff1a; 双击Sphere这一行的灰色文件&#xff0c;可以看到远程…

UE5/UE4中3D汉字字体文字的创建与实现

本案例工程下载位置&#xff1a;https://mbd.pub/o/bread/ZZqVmJ9v 在虚幻引擎5&#xff08;UE5&#xff09;和虚幻引擎4&#xff08;UE4&#xff09;中&#xff0c;实现3D汉字字体的创建是一项常见的需求。 本文将详细介绍两种有效的方法&#xff1a; 1.通过TextRender配合Of…

Ubuntu系统安装 Redis

环境准备 Ubuntu 系统版本&#xff1a;22.04.3Redis 版本&#xff1a;6.2.12 检查本地 make 环境 make -version若没有安装&#xff0c;则需要安装 sudo apt install make检查本地 gcc 环境 gcc -version若没有安装&#xff0c;则需要安装 sudo apt install gcc。 sudo a…

第32关 k8s集群管理开源神器 - k9s

------> 课程视频同步分享在今日头条和B站 大家好&#xff0c;我是博哥爱运维。 随着我们管理维护的K8S集群上线&#xff0c;怎么管理好集群上面成百上千的服务pod&#xff0c;就是我们该操心的事情了。这里博哥把在生产中一直在用的一个开源管理工具k8s&#xff0c;github…

C++数据结构与算法——数组

C第二阶段——数据结构和算法&#xff0c;之前学过一点点数据结构&#xff0c;当时是基于Python来学习的&#xff0c;现在基于C查漏补缺&#xff0c;尤其是树的部分。这一部分计划一个月&#xff0c;主要利用代码随想录来学习&#xff0c;刷题使用力扣网站&#xff0c;不定时更…

Facebook的创新征程:社交媒体的演进之路

在当今数字化时代&#xff0c;社交媒体已经成为人们生活中不可或缺的一部分&#xff0c;而Facebook作为社交媒体领域的巨头&#xff0c;一直在不断创新和演进。本文将深入探讨Facebook的创新征程&#xff0c;追溯其社交媒体的发展历程&#xff0c;探讨其对用户、社会和数字时代…

hcip---ospf综合实验

一&#xff1a;实验要求 1、R4为ISP&#xff0c;其上只能配置IP地址&#xff0c;R4与其所有直连设备间均使用公有IP 2、R3-R5/6/7为MGRE环境&#xff0c;R3为中心站点 3、整个OSPF环境IP基于R4的环回 4、所有设备均可访问R4的环回 5、减少LSA的更新量&#xff0c;加快收敛…

基础算法(二)

一 高精度计算 int能表示范围为2^32&#xff0c;这看起来很大&#xff0c;但在大数据时代的如今&#xff0c;不说是int 哪怕是long long也是不够的&#xff0c;那么为了使用或计算这些超出或远超整形大小的数&#xff0c;我们这些数的计算方法称为高精度计算。 &#xff08;1)…