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

news2024/11/28 18:59:41

前言

        在前几篇文章中,已经介绍了指针一些基本概念、用途和一些不同类型的指针,下文将介绍某些指针类型的运用。本文主要介绍函数指针数组、转移表(函数指针的用途)、回调函数、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;
}

 运行结果

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

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

相关文章

京东h5st4.7逆向分析

声明 本文章中所有内容仅供学习交流使用&#xff0c;不用于其他任何目的&#xff0c;不提供完整代码&#xff0c;抓包内容、敏感网址、数据接口等均已做脱敏处理&#xff0c;严禁用于商业用途和非法用途&#xff0c;否则由此产生的一切后果均与作者无关&#xff01; 本文章未…

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

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

SpringAMQP-消息转换器

这边发送消息接收消息默认是jdk的序列化方式&#xff0c;发送到服务器是以字节码的形式&#xff0c;我们看不懂也很占内存&#xff0c;所以我们要手动设置一下 我这边设置成json的序列化方式&#xff0c;注意发送方和接收方的序列化方式要保持一致 不然回报错。 引入依赖&#…

STM32_HAL_TIM_1介绍

1.F1的定时器类型&#xff08;高的拥有低级的全部功能&#xff09; 高级定时器&#xff08;TIM1和TIM8&#xff09;&#xff1a; 16位自动重装载计数器。支持多种工作模式&#xff0c;包括中心对齐模式、边沿对齐模式等。可以产生7个独立的通道&#xff0c;用于PWM、输出比较、…

Cosmo Bunny Girl

可爱的宇宙兔女郎的3D模型。用额外的骨骼装配到Humanoid上,Apple混合了形状。完全模块化,包括不带衣服的身体。 技术细节 内置,包括URP和HDRP PDF。还包括关于如何启用URP和HDRP的说明。 LOD 0:面:40076,tris 76694,verts 44783 装配了Humanoid。添加到Humanoid中的其他…

测试用例编写规范

1.1目的 统一测试用例编写的规范&#xff0c;为测试设计人员提供测试用例编写的指导&#xff0c;提高编写的测试用例的可读性&#xff0c;可执行性、合理性。为测试执行人员更好执行测试&#xff0c;提高测试效率&#xff0c;最终提高公司整个产品的质量。 1.2使用范围 适用…

数字人实训室助推元宇宙人才培养

如今&#xff0c;全身动作捕捉设备已经大量应用在影视、动画、游戏领域&#xff0c;在热门的元宇宙内容领域中&#xff0c;全身动作捕捉设备逐步发挥着重要的作用&#xff0c;在包括体育训练、数字娱乐虚拟偶像、虚拟主持人、非物质文化遗产保护等等场景&#xff0c;数字人实训…

第5章 处理GET请求参数

1 什么是GET请求参数 表单GET请求参数是指在HTML表单中通过GET方法提交表单数据时所附带的参数信息。在HTML表单中&#xff0c;可以通过表单元素的name属性来指定表单字段的名称&#xff0c;通过表单元素的value属性来指定表单字段的值。当用户提交表单时&#xff0c;浏览器会将…

【数据结构】有关栈和队列相互转换问题

文章目录 用队列实现栈思路实现 用栈实现队列思路实现 用队列实现栈 Leetcode-225 用队列实现栈 思路 建立队列的基本结构并实现队列的基本操作 这部分这里就不多说了&#xff0c;需要的可以看笔者的另一篇博客 【数据结构】队列详解(Queue) 就简单带过一下需要实现的功能 …

金融业开源软件应用 评估规范

金融业开源软件应用 评估规范 1 范围 本文件规定了金融机构在应用开源软件时的评估要求&#xff0c;对开源软件的引入、维护和退出提出了实现 要求、评估方法和判定准则。 本文件适用于金融机构对应用的开源软件进行评估。 2 规范性引用文件 下列文件中的内容通过文中的规范…

数据科学:使用Optuna进行特征选择

大家好&#xff0c;特征选择是机器学习流程中的关键步骤&#xff0c;在实践中通常有大量的变量可用作模型的预测变量&#xff0c;但其中只有少数与目标相关。特征选择包括找到这些特征的子集&#xff0c;主要用于改善泛化能力、助力推断预测、提高训练效率。有许多技术可用于执…

【kettle012】kettle访问FTP服务器文件并处理数据至PostgreSQL(已更新)

1.一直以来想写下基于kettle的系列文章,作为较火的数据ETL工具,也是日常项目开发中常用的一款工具,最近刚好挤时间梳理、总结下这块儿的知识体系。 2.熟悉、梳理、总结下FTP服务器相关知识体系 3.欢迎批评指正,跪谢一键三连! kettle访问FTP服务器文件并处理数据至PostgreS…

【Unity UI系统介绍】

Unity UI系统介绍 想了解更多游戏开发知识,可以扫描下方二维码,免费领取游戏开发4天训练营课程 Unity UI 是 Unity 引擎中的一套用户界面&#xff08;UI&#xff09;系统&#xff0c;允许开发者创建和管理游戏的用户界面。 Canvas&#xff1a;Canvas 是 Unity UI 的核心组件…

如何3分钟快速训练一个属于自己的(暴躁老哥、猫娘)AI大模型?(弱智吧经典问题为例)

首先我们进入谷歌Gemini&#xff1a;Gemini - Google DeepMind 然后我们进入官网看见左边的几个选项 选择Create new prompt创建新的提示 选择结构化提示 点击action可以增加列&#xff0c;也就是设置更多回答或者选项 那么那个温度&#xff08;Temperature&#xff09;是什么…

二、安装、使用Grafana

目录 一、安装Grafana 二、使用grafana 一、安装Grafana 官网&#xff1a;https://grafana.com/ 账号&#xff1a;admin 密码&#xff1a;xxxxxx [rootrabbitmq_2 prometheus]# [rootrabbitmq_2 prometheus]# wget https://dl.grafana.com/enterprise/release/grafana-enter…

redis安装与群集

项目需求&#xff1a; 1.安装redis 2.测试redis性能&#xff0c;100个并发连接&#xff0c;100000个请求测试 3.在当前数据库下创建键值对 a11,a22,a33,a44&#xff0c;a55 4.查看键值对 5.将a1改名为a11,将a2删除 5.将a3移动到1号数据库 6搭建redis集群(可选) 测试环境…

第六十节 Java设计模式 - 过滤器/标准模式

Java设计模式 - 过滤器/标准模式 过滤器模式使用不同的条件过滤对象。 这些标准可以通过逻辑操作链接在一起。 过滤器模式是一种结构型模式。 例子 import java.util.List; import java.util.ArrayList;class Employee {private String name;private String gender;private…

【Spring】Springmvc学习Ⅲ

# Spring&#xff4d;vc学习Ⅲ 文章目录 一、图书管理系统1. 功能1.1 登录前端接口前端代码后端接口后端代码 1.2 图书列表展示步骤:图书类代码mock数据代码控制层调用代码服务层代码&#xff08;存储除数据库中需要存储的数据&#xff09; 2. 分层控制2.1 三层架构2.2 代码重…

C语言实现简单的日历功能

开篇 本篇文章的题目来源于《编程珠玑》第三章课后习题的第四个问题&#xff0c;也是我会手动实现的本章的最后一个功能。 问题概要 给定月和年&#xff0c;使用字符数组生成该月的日历&#xff08;含有周几的日历&#xff09;。 思路分析 为了生成给定年份中某个月的日历&…

【光线重塑技术】小姐姐,美得不可方物——lllyasviel/ic-light

在英伟达自18年宣布光追技术之后&#xff0c;RTX显卡也成了目前Steam游戏的常客。就连 AMD、Intel 和 Apple Silicon 都宣布要在GPU上支持光追算法。这次我要介绍的是huggingface上比较火的relight技术—— ic-light 介绍 IC-Light 是一个操纵图像照明的项目。 IC-Light &qu…