指针的介绍4【回调函数、qsort函数的运用】

ops/2025/1/31 21:08:24/

1.回调函数

1.1定义

回调函数就是通过函数指针而被调用的函数

把函数的指针(地址)作为参数传递给另⼀个函数,当这个指针被⽤来调⽤其所指向的函数 时,被调⽤的函数就是回调函数 

 回调函数不是由该函数的实现⽅直接调⽤,⽽是在特定的事件或条 件发⽣时由另外的⼀⽅调⽤的,⽤于对该事件或条件进⾏响应

1.2示例

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>int Add(int x, int y)
{return x + y;
}int Sub(int x, int y)
{return x - y;
}void Cacl(int (*func)(int, int))
{printf("请输入两个操作数:");int y = 0;int x = 0;scanf("%d %d", &x, &y);int ret = func(x, y);printf("%d\n", ret);
}void menu()
{printf("**********************\n");printf("*** 1.Add    2.Sub ***\n");printf("*** 0.Out         ****\n");printf("**********************\n");
}
int main()
{int input;do{menu();printf("请选择:");scanf("%d", &input);switch (input){case 1:Cacl(Add);break;case 2:Cacl(Sub);break;case 0:printf("已退出计算器\n");break;default:printf("选择有误,请重新选择\n");}} while (input);return 0;
}

这是一个只实现了加减法的简易计算器

用户输入input之后,

调用相应的Cacl函数

Cacl函数接收用于计算加减法函数的地址

并在内部进行相应加减法函数的调用

此时,被调用的加减法函数就叫做回调函数

此时的Add函数就叫做回调函数

在这个过程中,我们并不是直接调用了Add函数

而是通过函数指针调用了Add函数

再看下面这句话,你就有更深的理解了

 回调函数不是由该函数的实现⽅直接调⽤,⽽是在特定的事件或条 件发⽣时由另外的⼀⽅调⽤的,⽤于对该事件或条件进⾏响应 

 2.qsort函数

qosrt函数可以对任意类型的数据进行升序或者降序排序

2.1qsort函数的介绍

I参数

因为不知道要传入的是什么类型的指针,

所以统一使用 void* 来接收

从左往右,要传入的

第一个参数是 待排序数组的第一个元素的地址

 第二个参数是 元素个数

第三个参数是 每个元素的大小,单位是字节

第四个参数是 一个函数指针

qsort函数通过这个函数指针调用相关的函数

qsort函数要调用的函数是程序员自己写的

因为

不同的类型有不同的比较方式

字符串、结构体的排序

不能粗暴的使用< > != ==进行比较

整型、浮点型的排序可以

程序员自己写的函数就是实现数据比较方式的函数

这样qosrt函数就没必要实现多种数据的比较

只需要根据该函数的返回值进行相关的操作即可

程序员自己写的函数的要求 :

(1)程序员自己写的函数应该与函数指针的类型保持一致

下面是一个正确的函数声明

int cmp_int(const void*p1,const void*p2);
声明时,形参名可以不写

这是想声明一个实现整型比较的函数

该函数返回值为int,形参为(const void*p1,const void*p2)

(1.2

p1指向一个数组元素

p2指向的是p1指向的元素之后的第一个元素

(2)函数内部的要求:

(2.1)void*不能直接解引用或+-整数操作

所以需要根据需求进行相应的显式类型转换

(2.2)显示类型转换后,

当p1指向的内容大于p2时,函数返回 大于0的值

当p1指向的内容小于p2时,函数返回 大于0的值

当p1指向的内容等于p2时,函数返回 0

2.2qsort函数的使用

qsort函数的使用需要包含头文件<stdlib.h>

#include <stdio.h>
#include <stdlib.h>int cmp_int(const void* p1, const void* p2)
{return *((int*)p1) - *((int*)p2);
}
int main()
{int arr[] = { 1,3,8,6,4,7,9,5,2,0 };int sz = sizeof(arr) / sizeof(arr[0]);qsort(arr, sz, sizeof(arr[0]), cmp_int);for (int i = 0; i < sz; ++i)printf("%d ", arr[i]);return 0;
}

这行代码调用了qsort函数

这段代码实现了整型函数的比较方式:

(1)将p1、p2显示类型转换为 int*

(2)解引用后相减

(3)然后可以直接返回

这就实现了升序排序

当然也可以降序:只需要将

*((int*)p1) - *((int*)p2)

改为

*((int*)p2) - *((int*)p1)

这就实现了降序

上面是实现了整型排序:

下面展示字符串

 p1、p2指向的是一个字符串,即指向了一个指针

那显示制转换为二级指针,再进行解引用操作

总结:

qsort函数使用的重点是

实现 数据类型比较 的函数

 

 


http://www.ppmy.cn/ops/154577.html

相关文章

APT (Advanced Package Tool) 安装与使用-linux014

APT (Advanced Package Tool) APT (Advanced Package Tool) 是一个用于管理 Debian 和 Ubuntu 系列 Linux 发行版上的软件包的工具。它简化了软件的安装、升级、配置和删除过程。APT 为用户提供了一个统一的命令行接口&#xff0c;使得管理和安装软件变得更加简单。 APT 主要…

FreeMarker框架的用法指南

FreeMarker框架的用法指南 一、FreeMarker简介 FreeMarker是一个基于模板生成文本输出的通用工具&#xff0c;使用纯Java编写&#xff0c;能够生成HTML、XML、JSON、RTF、Java源代码等多种格式的文本。它广泛应用于Web开发、邮件生成、报告生成等场景&#xff0c;允许将数据模…

Golang —协程池(panjf2000/ants/v2)

Golang —协程池&#xff08;panjf2000/ants/v2&#xff09; 1 ants1.1 基本信息1.2 ants 是如何运行的&#xff08;流程图&#xff09; 1 ants 1.1 基本信息 代码地址&#xff1a;github.com/panjf2000/ants/v2 介绍&#xff1a;ants是一个高性能的 goroutine 池&#xff0c…

sunrays-framework配置重构

文章目录 1.common-log4j2-starter1.目录结构2.Log4j2Properties.java 新增两个属性3.Log4j2AutoConfiguration.java 条件注入LogAspect4.ApplicationEnvironmentPreparedListener.java 从Log4j2Properties.java中定义的配置读取信息 2.common-minio-starter1.MinioProperties.…

7层还是4层?网络模型又为什么要分层?

~犬&#x1f4f0;余~ “我欲贱而贵&#xff0c;愚而智&#xff0c;贫而富&#xff0c;可乎&#xff1f; 曰&#xff1a;其唯学乎” 一、为什么要分层 \quad 网络通信的复杂性促使我们需要一种分层的方法来理解和管理网络。就像建筑一样&#xff0c;我们不会把所有功能都混在一起…

基础项目实战——3D赛车(c++)

目录 前言一、渲染引擎二、关闭事件三、梯形绘制四、轨道绘制五、边缘绘制六、草坪绘制七、前后移动八、左右移动​九、曲线轨道​十、课山坡轨道​十一、循环轨道​十二、背景展示​十三、引入速度​十四、物品绘制​十五、课数字路障​十六、分数展示​十七、重新生成​十八、…

C++17 搜索器教程:解锁高效搜索新姿势

C17搜索器教程&#xff1a;解锁高效搜索新姿势 C17搜索器简介 在C的发展历程中&#xff0c;C17是一个重要的里程碑&#xff0c;它引入了诸多实用的新特性&#xff0c;搜索器功能便是其中之一。此功能着重对std::search算法进行了强化&#xff0c;使其支持多种搜索策略&#x…

关于opencv环境搭建问题:由于找不到opencv_worldXXX.dll,无法执行代码,重新安装程序可能会解决此问题

方法一&#xff1a;利用复制黏贴方法 打开opencv文件夹目录找到\opencv\build\x64\vc15\bin 复制该目录下所有文件&#xff0c;找到C:\Windows\System32文件夹&#xff08;注意一定是C盘&#xff09;黏贴至该文件夹重新打开VS。 方法二&#xff1a;直接配置环境 打开opencv文…