初识C语言指针(5)

目录

1. 回调函数

2. qsort函数

2.1 qsort函数的基本参数

2.2 qsort函数的使用

2.3 qsort排序结构体类型数据

结语


1. 回调函数

什么是回调函数呢?回调函数就是⼀个通过函数指针调⽤的函数。

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

例如:

在主函数中将 add 函数的地址作为 test 函数的参数,test 函数的形参部分使用函数指针来接收,test 函数通过add函数的指针调用 add 函数,此时的add函数就是回调函数。

https://blog.csdn.net/2402_86304740/article/details/141501264icon-default.png?t=N7T8https://blog.csdn.net/2402_86304740/article/details/141501264在之前的博客中讲述到的制作计算器的练习中,就是运用回调函数实现的。

2. qsort函数

什么是qsort函数呢?在之前的学习中我们讲过冒泡排序,但是冒泡排序好像只能排序整形类型的数组,那么其他类型的数组该如何进行排序呢?

这时候就提到了qsort 函数,qsort函数是一个用于排序的函数,qsort函数可以排序任何类型的数组,使用qsort函数前,需要包含一个头文件 ———#include<stdlib.h>。接下来我们来学习一下qsort函数该如何使用。

2.1 qsort函数的基本参数

qsort函数有4个参数:

 那么这4个参数分别代表什么意思呢?

 1. void *base:

        base中存放的是待排序数组的首元素的地址,类型为void *类型
 2. size_t num:

        num存放的是base指向的数组中的元素个数,类型为size_t类型
 3. size_t size:

        size是base指向的数组中一个元素的长度,单位是字节,类型为size_t类型

4. int compar(const void*pl,const void*p2):

        指向比较两个元素的函数。qsort反复调用这个函数来比较两个元素

        如果p1指向的元素大于p2指向的元素,那么函数返回>0的数字
        如果p1指向的元素等于p2指向的元素,那么函数返回0
        如果p1指向的元素小于p2指向的元素,那么函数返回<0的数字

现在了解完qsort函数的基本参数后,我们就可以上手实践一下啦!

2.2 qsort函数的使用

假设我们要排序一个整形数组:

​
#include <stdio.h>void print(int *pa, int sz)
{for (int i = 0; i < sz; i++){printf("%d ", *(pa+i));}printf("\n");
}
int int_cmp(const void* p1, const void* p2)//比较大小
{return (*(int*)p1 - *(int*)p2);
}int main()
{int arr[10] = { 1, 3, 5, 7, 9, 2, 4, 6, 8, 10 };int i = 0;printf("排序前:");print(arr, sizeof(arr) / sizeof(arr[0]));qsort(arr, sizeof(arr) / sizeof(arr[0]), sizeof(arr[0]), int_cmp);//开始排序printf("排序后:");print(arr, sizeof(arr) / sizeof(arr[0]));return 0;
}​

 首先我们在主函数中定义一个待排序的数组arr,然后使用qsort函数排序,qsort函数的第一个参数是arr数组首元素的地址,qsort函数的第二个参数是数组的元素个数,qsort函数的第三个参数是数组中单个元素的大小,最后最为重要的就是指向比较2个元素大小的函数(cmp)的地址而cmp函数就是我们自己定义的比较函数

这里cmp函数的参数为什么用void *类型的指针接收呢?因为我们并不能确定我们比较的是哪种类型的数据,而void *可以接收任意类型的指针,在进行比较的时候强制转换成我们想要的类型即可,例如这里强转成整形指针,再进行解引用即可进行计算,如果p1指向的元素大于p2指向的元素,那么函数cmp返回>0的数字,如果p1指向的元素等于p2指向的元素,那么函数cmp返回0,如果p1指向的元素小于p2指向的元素,那么函数cmp返回<0的数字。当qsort具备这些参数时,就可以完成排序了。当然这里排序的还是整数,好像不能体现qsort的神奇之处,接下来我们排序结构体类型的数据。

2.3 qsort排序结构体类型数据

struct Stu //学⽣
{char name[20];//名字int age;//年龄
};
int cmp_stu_by_name(const void* e1, const void* e2)
{return strcmp((*(struct Stu*)e1).name, (*(struct Stu*)e2).name);
}
void print(struct Stu* ps, int sz)
{for (int i = 0; i < sz; i++){printf("%s ",ps[i].name);}printf("\n");
}
int main()
{struct Stu s[] = { {"zhangsan", 20}, {"lisi", 30}, {"wangwu", 15} };int sz = sizeof(s) / sizeof(s[0]);printf("排序前:");print(s, sz);qsort(s, sz, sizeof(s[0]), cmp_stu_by_name);printf("排序后:");print(s, sz);return 0;
}

 我们定义一个结构体,里面定义两个变量存放学生的名字和学生的年龄,在主函数中创建一个结构体数组,里面存放3个学生的信息,这次我们通过学生的名字进行排序,需要自己定义一个比较学生名字的函数(cmp_stu_by_name),因为学生的名字是字符串,所以不能用 > <号进行比较,这时候就需要用到 strcmp函数比较2个字符串的大小,如果strcmp中的第一个参数(字符串1)大于第二个参数(字符串2)则返回大于0的数,如果strcmp中的第一个参数(字符串1)小于第二个参数(字符串2)则返回小于0的数,如果strcmp中的第一个参数(字符串1)等于第二个参数(字符串2)则返回0

最后使用qsort函数就可以完成排序啦~

结语

本章的内容主要讲解的就是qsort函数的如何使用的,qsort函数的使用包含了许多指针部分所学的知识,如果感兴趣的小伙伴可以手动模拟实现一个qsort函数。对于指针的部分在这里就告一段落啦,相信大家看完这几篇关于指针部分的内容,一定对指针有更深入的理解,在此感谢各位的观看,祝大家在编程的道路上越走越远!!!

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何使用ssm实现铁岭河医院医患管理系统+vue

TOC ssm077铁岭河医院医患管理系统vue 系统概述 进过系统的分析后&#xff0c;就开始记性系统的设计&#xff0c;系统设计包含总体设计和详细设计。总体设计只是一个大体的设计&#xff0c;经过了总体设计&#xff0c;我们能够划分出系统的一些东西&#xff0c;例如文件、文…

《黑神话:悟空》中的实景三维建模

这几天&#xff0c;国产游戏《黑神话:悟空》终于面世&#xff0c;迅速引爆了全球游戏市场。作为一款以《西游记》为背景的3A级动作角色扮演游戏&#xff0c;《黑神话:悟空》不仅在文化表达上极具吸引力&#xff0c;其背后的技术实力更是令人瞩目。本文将深入探讨&#xff0c;3A…

UEditor百度富文本后端上传文件接口

UEditor百度富文本后端上传文件接口 直接上代码 接口&#xff1a; RequestMapping("/UEditorConfig")public String list(HttpServletRequest request, HttpServletResponse response) throws IOException {String config environment.getProperty("ueditor.c…

C/C++逆向:寻找main函数(Debug-x86)

在程序的逆向分析中&#xff0c;寻找main函数在逆向分析中是非常重要的&#xff0c;它是程序的核心执行点&#xff0c;从这里开始&#xff0c;程序的主要逻辑开始展开&#xff1b;在这边我们需要明确两个概念&#xff1a;用户入口&#xff08;User Entry Point&#xff09; 和 …

【HarmonyOS】鸿蒙应用蓝牙功能实现 (三)

【HarmonyOS】鸿蒙应用蓝牙功能实现 &#xff08;三&#xff09; 前言 今天整理蓝牙Demo代码&#xff0c;查看官网时发现自己帐号没有登录&#xff0c;竟然也可以访问最新的API文档&#xff0c;真是喜大奔普。看来华为已经开始对外开放最新的API文档&#xff0c;不再有白名单…

《机器学习》—— 使用过采样方法实现逻辑回归分类问题

文章目录 一、什么是过采样方法&#xff1f;二、使用过采样方法实现逻辑回归分类问题三、过采样的优缺点 本篇内容是 基于Python的scikit-learn库中sklearn.linear_model 类中的 LogisticRegression&#xff08;&#xff09;逻辑回归方法实现的&#xff0c;其内容中只是在处理…

使用Java进行中小学违规教育培训数据采集实践-以某城市为例

目录 前言 一、违规教育信息 1、内容管理 2、转换后的内容 二、数据库设计 1、空间数据库 三、字符地址位置转换空间信息 1、实现时序图 2、后台实体类的设计与实现 3、数据持久化操作 四、总结 前言 时间来到2024年8月24日&#xff0c;时间过得很快&#xff0c;2024…

芯片后端之 PT 使用 report_timing 产生报告 之 -include_hierarchical_pins 选项

今天,我们再学习一点点 后仿真相关技能。 那就是,了解 report_timing 中的 -include_hierarchical_pins 选项。 如果我们仅仅使用如下命令,执行后会发现: pt_shell> report_timing -from FF1/CK -to FF2/d -delay_type max 我们使用命令 report_timing 报出的如上路…

C++篇:C向C++迈进(上)

引言 C语言作为编程基石&#xff0c;其高效与直接性深受开发者喜爱。然而&#xff0c;随着软件复杂度的增加&#xff0c;C以其面向对象及高级特性成为了新的选择。我们接下来将学习C&#xff0c;从C语言迈向C。 什么是C C 是一种高级语言&#xff0c;由 Bjarne Stroustrup 于…

python测试框架之Pytest

初识Pytest Pytest1.Pytest的特点&#xff1a;2.Pytest的基本使用规则3.pytest安装1&#xff09;使用编译器安装2&#xff09;使用命令安装 4.pytest规则 Pytest Pytest是python的一个第三方单元测试库&#xff0c;它的目的是让单元测试变得容易&#xff0c;并且也能扩展到支持…

VSCode插件 live Server

普通打开 安装live Server 包含端口 说明内置了服务器

视频插帧—— RIFE 和 IFNet 的机制和应用

介绍 最近&#xff0c;数字和模拟技术开始加速融合。我们生活在一个人工智能技术能够显著提高质量的时代&#xff0c;只要模拟材料能够数字化。 例如&#xff0c;讨论中涉及到的纸艺软件&#xff0c;纸龙的移动模型被时间锁定&#xff0c;以大约 3 fps&#xff08;每秒帧数&a…

一元四次方程求解-【附MATLAB代码】

目录 前言 求解方法 MATLAB验证 附&#xff1a;一元四次方程的故事 前言 最近在研究机器人的干涉&#xff08;碰撞&#xff09;检测&#xff0c;遇到了一个问题&#xff0c;就是在求椭圆到原点的最短距离时&#xff0c;构建的方程是一个一元四次方程。无论是高中的初等数学…

Flink1.18 同步 MySQL 到 Doris

一、前言 使用Apache Flink实现数据同步的ETL&#xff08;抽取、转换、加载&#xff09;过程通常涉及从源系统&#xff08;如数据库、消息队列或文件&#xff09;中抽取数据&#xff0c;进行必要的转换&#xff0c;然后将数据加载到目标系统&#xff08;如另一个数据库…

【Node】【1】node和nvm安装

安装nvm、node、npm 安装node 18 &#xff0c;最简单的办法是使用nvm&#xff0c;就不用手动安装了&#xff0c;那么就得先安装nvm。 NVM 是Node Version Manager&#xff0c;用于管理 Node.js 版本。你设备上的不同项目可能使用不同版本的 Node.js。通过 nvm&#xff0c;用户…

HTTP与HTTPS:数据安全性的差异与风险分析

在现代互联网通信中&#xff0c;HTTP&#xff08;HyperText Transfer Protocol&#xff0c;超文本传输协议&#xff09;和HTTPS&#xff08;HyperText Transfer Protocol Secure&#xff0c;超文本传输安全协议&#xff09;是两种常见的网络协议&#xff0c;它们都在浏览器和服…

Telegram mini app 本地开发配置

前言&#xff1a; 为了能在telegram里本地调试mini app&#xff0c;参考了网上很多方案&#xff0c;踩了不少坑。最后整了一个适合自己的方案&#xff0c;记录一下。 这个方案一定不是最好的&#xff0c;不过是目前适合我上手开发的方案了。 本文章适合需要在 telegram 本地…

拼多多20家店铺登满了怎么办

解决拼多多多店铺管理难题&#xff1a;河鱼浏览器的妙用&#xff01; 在电商领域&#xff0c;拼多多已经成为许多商家的重要销售渠道。然而&#xff0c;对于同时管理多个拼多多店铺的商家来说&#xff0c;如何高效地运营这些店铺成为了一大挑战。特别是当你的店铺数量达到20家…

简化登录流程,助力应用建立用户体系

随着智能手机和移动应用的普及&#xff0c;用户需要在不同的应用中注册和登录账号&#xff0c;传统的账号注册和登录流程需要用户输入用户名和密码&#xff0c;这不仅繁琐而且容易造成用户流失。 华为账号服务&#xff08;Account Kit&#xff09;提供简单、快速、安全的登录功…

docker镜像,ip,端口映射,持久化

docker 镜像的迁移&#xff1a;导出和导入镜像 查看镜像&#xff1a; [rootdocker ~]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE centos latest 5d0da3dc9764 2 years ago 231MB 打包 将镜像打包&#xff0c;找到save,可以将…