初识指针(5)<C语言>

前言

        在前几篇文章中,已经介绍了指针一些基本概念、用途和一些不同类型的指针,下文将介绍某些指针类型的运用。本文主要介绍函数指针数组、转移表(函数指针的用途)、回调函数、qsort使用举例等。


函数指针数组

        函数指针数组即每个元素都是函数地址的数组。

//函数指针数组
int jia(int x, int y) {//加法函数
	return x + y;
}
int jian(int x, int y) {//减法函数
	return x - y;
}
int cheng(int x, int y) {//乘法函数
	return x * y;
}
int chu(int x, int y) {//除法函数
	return x / y;
}
int main() {
	int (*p[4]) (int, int) = {jia,jian,cheng,chu};
	//保证p与[]先结合成数组,之后再与*结合,构成指针数组,最后再和函数结合
	return 0;
}

 转移表(函数指针的用途)

        假如我们写个程序完成对两个数之间的简单数学运算(加减乘除),按照正常的写法,选择一种计算后进入判断环节,之后再输入数字,这样写每一种运算下都会有代码重复,有没有办法简化代码呢?


回调函数

        即一个通过函数指针调用的函数。

        通过回调函数,可以消除特定场景中因为多分支造成的重复代码,例如:一个实现加减乘除的程序中,每个分支下都有一种运算,每个运算可写成一个函数,我们可以再写一个函数将每种分支下的重复代码包含进去,通过传入函数指针来调用运算函数,从而完成运算。

//回调函数
int jia(int x, int y) {
	return x + y;
}
int jian(int x, int y) {
	return x - y;
}
int cheng(int x, int y) {
	return x * y;
}
int chu(int x, int y) {
	return x / y;
}
void menu() {
	printf("**********************\n");
	printf("***1.加法   2.减法****\n");
	printf("***3.乘法   4.除法****\n");
	printf("***    0.exit     ****\n");
	printf("**********************\n");
}
int hui(int(*p)(int, int)) {
	int x, y;
	printf("请输入操作数\n");
	scanf("%d%d", &x, &y);
	return p(x, y);
}
int main() {
	int i, x, y,ret;
	do {
		menu();
		printf("请选择—>");
		scanf("%d", &i);
		switch (i) {
		case 1:
			ret = hui(jia);
			printf("%d\n", ret);
			break;
		case 2:
			ret = hui(jian);
			printf("%d\n", ret);
			break;
		case 3:
			ret = hui(cheng);
			printf("%d\n", ret);
			break;
		case 4:
			ret = hui(chu);
			printf("%d\n", ret);
			break;
		case 0:
			printf("退出计算\n");
			break;
		default:
			printf("输入错误,重新输入\n");
			break;
		}
	} while (i);
	return 0;
}

qsort使用举例

        qsort函数是C语言的库函数,包含在<stdlib.h>头文件中,它可用于对所有数据类型进行排序,包括结构体,使用这个库函数,必须再写个比较元素的函数,返回int型(大于0:大于、等于0:等于、小于0:小于),默认升序,如要进行逆序输出,则在比较函数中,交换操作数的位置。

排序整型数组
//qsort函数,排序整型数组
#include<stdio.h>
#include<stdlib.h>
int  intcmp (const void* p1, const void* p2) {//比较函数,两个元素的比较
	return (*(int*)p1) - (*(int*)p2);
}
int main() {
	int arr[6] = { 3,6,2,0,3,8 };
	int sz = sizeof(arr) / sizeof(arr[1]);
	qsort(arr,//数据类型void*base,用于接受待排序的数组的数组名,也就是首元素的地址
		sz,//数据类型sizeof_t,待排序数组的元素个数
		sizeof(arr[0]),//数据类型sizeof_t,待排序数组元素字节大小
		intcmp);
//数据类型 int(*) (const void*,const void*),用于接收俩个元素比较的函数,
//返回值:大于0(表示大于),等于0(等于),小于0(小于)
	for (int i = 0; i < sz; i++) {
		printf("%d ", arr[i]);
	}
	return 0;
}

运行结果:

排序结构体

按字符排

//qsort函数,结构体
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
struct stu {
	char name[100];
	int  age;
	int  height;
};
int namecmp(const void* p1, const void* p2) {//按名称排
	return strcmp((*(struct stu*)p1).name, (*(struct stu*)p2).name);
}
int main() {
	struct stu arr[] = { {"zk",18,163},{"tian",19,180},{"xing",17,170} };
	int sz = sizeof(arr) / sizeof(arr[1]);
	qsort(arr,sz,sizeof(arr[0]),namecmp);
	for (int i = 0; i < sz; i++) {
		printf("%s %d %d\n", arr[i].name, arr[i].age, arr[i].height);
	}
	return 0;
}

运行结果

 按照整形排

//qsort函数,结构体
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
struct stu {
	char name[100];
	int  age;
	int  height;
};
//int namecmp(const void* p1, const void* p2) {//按名称排
//	return strcmp((*(struct stu*)p1).name, (*(struct stu*)p2).name);
//}
int agecmp(const void* p1, const void* p2) {//按照年龄排
	return (*(struct stu*)p1).age - (*(struct stu*)p2).age;
}
int main() {
	struct stu arr[] = { {"zk",18,163},{"tian",19,180},{"xing",17,170} };
	int sz = sizeof(arr) / sizeof(arr[1]);
	qsort(arr,sz,sizeof(arr[0]),agecmp);
	for (int i = 0; i < sz; i++) {
		printf("%s %d %d\n", arr[i].name, arr[i].age, arr[i].height);
	}
	return 0;
}

 运行结果

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

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

相关文章

24年做抖音小店,你还停留在数据?别人都已经开始注重利润了

大家好&#xff0c;我是电商笨笨熊 一件事情持续做&#xff0c;一个项目持续深耕&#xff0c;意义到底是什么&#xff1f; 这句话我常常说&#xff0c;但很多人似乎走偏了实际意义&#xff1b; 尤其对于新手来说&#xff0c;做抖音小店总是向往某某老玩家多么牛的数据&#…

如何把握人力RPO的蓝海机遇?实战策略分享!

随着企业间竞争的日益激烈&#xff0c;人力资源管理的重要性愈发凸显。在众多人力资源管理策略中&#xff0c;招聘流程外包(RPO)作为一种新兴的服务模式&#xff0c;逐渐受到业界的关注。那么&#xff0c;人力RPO是否是蓝海项目?我们又该如何实施RPO呢? 一、人力RPO&#xff…

C++干货--引用

前言&#xff1a; C的引用&#xff0c;是学习C的重点之一&#xff0c;它与指针的作用有重叠的部分&#xff0c;但是它绝不是完全取代指针(后面我们也会简单的分析)。 引用的概念&#xff1a; 引用 不是新定义一个变量 &#xff0c;而 是给已存在变量取了一个别名 &#xf…

经典文献阅读之--D-Map(无需射线投射的高分辨率激光雷达传感器的占据栅格地图)

0. 简介 占用地图是机器人系统中推理环境未知和已知区域的基本组成部分。《Occupancy Grid Mapping without Ray-Casting for High-resolution LiDAR Sensors》介绍了一种高分辨率LiDAR传感器的高效占用地图框架&#xff0c;称为D-Map。该框架引入了三个主要创新来解决占用地图…

附录2 创建flask镜像

目录 1 python镜像 2 安装flask 3 把项目文件扔进去 3.1 创建git仓库 3.2 上传文件 3.3 获取git链接 3.4 在容器中git clone 4 启动flask服务 5 将容器保存为镜像 6 映射端口运行镜像 7 遇到的问题 8 Dockerfile创建镜像 1 python镜像 首先找一下fla…

Android 老年模式功能 放大字体

1 配置属性 <attr name"text_size_16" format"dimension"/><attr name"text_size_18" format"dimension"/><attr name"text_size_14" format"dimension"/><attr name"text_size_12&quo…

MySQL中的索引失效问题

索引失效的情况 这是正常查询情况&#xff0c;满足最左前缀&#xff0c;先查有先度高的索引。 1. 注意这里最后一种情况&#xff0c;这里和上面只查询 name 小米科技 的命中情况一样。说明索引部分丢失&#xff01; 2. 这里第二条sql中的&#xff0c;status > 1 就是范围查…

咸鱼之王游戏攻略:平民怎么起号?

在《咸鱼之王》这款游戏中&#xff0c;即使是平民玩家&#xff0c;也有着许多可以优化的操作&#xff0c;以最大程度地提高收益。本攻略将针对平民玩家的日常操作进行详细解读&#xff0c;包括黑市购买、资源管理等方面的建议&#xff0c;希望对广大玩家有所帮助。 一、黑市购买…

Vue的学习 —— <vue的开发环境> “6000字超详细”

目录 前言 学习目标 正篇开始 —— 部署vue开发环境 一、Visual Studio Code编辑器 1、简介 2、下载和安装VSCode编辑器 3、安装中文插件 4、安装Volar插件 5、使用VCode编辑器 二、Node.js环境 简介 下载和安装Node.js环境 三、包管理工具 1、简介 2、配置npm …

公司申请增加公众号数量

一般可以申请多少个公众号&#xff1f;众所周知&#xff0c;在2013年前后&#xff0c;公众号申请是不限制数量的&#xff0c;后来企业开始限制申请50个&#xff0c;直到2018年的11月tx又发布&#xff0c;其中个人主体可申请公众号由2个调整为1个&#xff0c;企业主体由50个调整…

信息量、熵、KL散度、交叉熵概念理解

信息量、熵、KL散度、交叉熵概念理解 (1) 信息量 信息量是对事件的不确定性的度量。 假设我们听到了两件事&#xff0c;分别如下&#xff1a;事件A&#xff1a;巴西队进入了世界杯决赛圈。 事件B&#xff1a;中国队进入了世界杯决赛圈。仅凭直觉来说&#xff0c;显而易见事件…

2024年蓝桥杯——复盘

1、握手问题 知识点&#xff1a;模拟 这道题很简单。但是不知道考试的时候有没有写错。一开始的43个人握手&#xff0c;仅需要两两握手&#xff0c;也就是从42个握手开始&#xff0c;而非43.很可惜。这道题没有拿稳这5分。也很有可能是这5分导致没有进决赛。 总结&#xff1a…

我的 OpenLiteSpeed 从开始到放弃之经历

昨晚下定决心放弃 OpenLiteSpeed 了&#xff0c;从开始到放弃历时七天。总结下来放弃 OpenLiteSpeed 主要是实在不适合明月当前的需要&#xff0c;用起来不是锦上添花而是个累赘了都&#xff0c;今天明月就给大家总结分享一下这次 OpenLiteSpeed 从开始到放弃的经历。 一、Ngin…

为什么大家都说it行业要死了?

年后开始找工作开始还不敢投简历怕准备不充分。怕错过了心仪的公司。 花了2周自己死磕了一下自我介绍&#xff0c;和工作经历。然后信心满满就开始投了&#xff0c;结果发现一堆人打招呼一阵欣喜的。可是一查全是外包公司。于是开始了自我怀疑。难道是我能力不行&#xff1f;难…

反转链表(C语言)———链表经典算法题

题目描述​​​​​​206. 反转链表 - 力扣&#xff08;LeetCode&#xff09;&#xff1a; 答案展示: 迭代&#xff1a; 递归&#xff1a; /*** Definition for singly-linked list.* struct ListNode {* int val;* struct ListNode *next;* };*/ struct ListNode* rev…

等保测评技术方案(五)

&#xff08;八&#xff09;漏洞扫描方案 1.参与人员 乙方工程师&#xff1a;谭 然、张 剑等。 范围经过双方确认&#xff0c;此次评估的对象包括&#xff1a; 2.网络设备 IP 地址 设备型号 备注 / / / / / / 以现场测评实际数据为准 3.应用系统 地址 …

Python从0到POC编写-魔法方法

name __name__ 是系统定义的内部函数&#xff0c; 它的作用是识别模块。 通常我们看到这样一句话&#xff1a; if __name__ __main____name__ 的值有两种情况&#xff0c;那么挨个来说下。 如果模块是被直接执行的 &#xff0c;那么 __name__ 的值 为 __main__ 例如&…

GBPC2510-ASEMI工业电源专用GBPC2510

编辑&#xff1a;ll GBPC2510-ASEMI工业电源专用GBPC2510 型号&#xff1a;GBPC2510 品牌&#xff1a;ASEMI 封装&#xff1a;GBPC-4 最大重复峰值反向电压&#xff1a;1000V 最大正向平均整流电流(Vdss)&#xff1a;25A 功率(Pd)&#xff1a;中小功率 芯片个数&#x…

汇聚荣科技:拼多多开店时后期押金可以退吗?

在电商领域&#xff0c;拼多多以其独特的团购模式迅速崛起&#xff0c;吸引了众多商家入驻。对于这些商家而言&#xff0c;了解平台的各项费用政策尤为重要&#xff0c;其中押金的退还问题是大家关注的焦点之一。那么&#xff0c;拼多多开店时后期押金可以退吗?答案是肯定的。…

要不还是别搞Google Play了

​好消息&#xff1a;误导性条款合规了 坏消息: 应用被暂停了&#xff0c;太难玩了 5.13日收到邮件&#xff0c;被告知应用因为应用内体验问题被暂停上架了 邮件大意是由于违反执行流程政策(Violation of Enforcement Process policy)。 这个政策主要是讲Google Play会对账户/…