发布时间:2026/8/20 14:19:22
C语言——深度理解指针(5) 耕耘 :C、C、嵌入式技术领域我的个人主页❄️个人专栏《C语言专栏》 《嵌入式专栏》✨**不要等待机会而要创造机会**✨博主简介:✨✨一位热爱生活的阳光大男孩.✨✨前言本文深入浅出地讲解了C语言中两个核心概念回调函数与qsort函数。回调函数作为函数指针的典型应用是实现灵活编程和事件响应的关键而qsort则是C标准库中功能强大的通用排序工具。文章将从回调函数的基本原理出发结合qsort对各种数据类型整型、字符、字符串、浮点型、结构体的排序实践通过丰富的代码示例帮助你掌握其用法与设计思想提升C语言编程能力。文章目录前言1. 回调函数是什么2. qsort 使⽤举例2.1 使⽤qsort函数排序整型数据2.2 使⽤qsort排序结构数据结语1. 回调函数是什么回调函数就是⼀个通过函数指针调⽤的函数。如果你把函数的指针地址作为参数传递给另⼀个函数当这个指针被⽤来调⽤其所指向的函数时被调⽤的函数就是回调函数。回调函数不是由该函数的实现⽅直接调⽤⽽是在特定的事件或条件发⽣时由另外的⼀⽅调⽤的⽤于对该事件或条件进⾏响应.。下面我们用代码实现一个加法运算intadd(inta,intb)//加法运算{returnab;}voidcalc(int(*pf)(int,int))//用calc调用add函数{intret0;intx,y;scanf_s(%d %d,x,y);retpf(x,y);printf(%d\n,ret);}intmain(){calc(add);return0;}上面代码中我们没有直间使用add函数而是把add的指针给了calc函数间接的调用了add函数。这就是回调函数。2. qsort 使⽤举例2.1 使⽤qsort函数排序整型数据首先我们先来认识一下什么是qsort函数qsort 是 C 标准库中提供的快速排序函数用于对数组进行排序。它能够对任意类型的数据进行排序通过用户自定义的比较函数实现灵活的排序规则。qsort函数的头文件stdlibqsort函数需要提供四个数据voidqsort(void*base,// 数组首元素地址size_tnmemb,// 数组元素个数size_tsize,// 每个元素的大小字节int(*compar)(constvoid*,constvoid*)// 比较函数的指针);用qsort函数进行升序运算1、排序对象是int时#includestdio.h#includestdlib.h//qsort函数的头文件//qosrt函数的使⽤者得实现⼀个⽐较函数intint_cmp(constvoid*p1,constvoid*p2){return(*(int*)p1-*(int*)p2);//因为p1和p2原先定义的时候是void*所以不可以直接解引用因为数组中元素类型是int所以要先强制转化成int*后在解引用}intmain(){intarr[]{1,3,5,7,9,2,4,6,8,0};inti0;qsort(arr,sizeof(arr)/sizeof(arr[0]),sizeof(int),int_cmp);//使用方法首元素地址数组元素个数元素的大小字节比较函数的指针for(i0;isizeof(arr)/sizeof(arr[0]);i){printf(%d ,arr[i]);}printf(\n);return0;}const void* p1: 指向数组中第一个待比较元素的指针。const void* p2: 指向数组中第二个待比较元素的指针。比较函数需返回整数也就是p1指向的值-p2指向的值负数第一个参数应排在第二个参数之前。0两参数相等。正数第一个参数应排在第二个参数之后2、排序对象是char类型时#includestdio.h// 用于输入输出#includestdlib.h// 用于qsort函数// 比较函数用于比较两个字符的大小intcompare_chars(constvoid*a,constvoid*b){charchar_a*(constchar*)a;charchar_b*(constchar*)b;returnchar_a-char_b;}intmain(){chararr[]{d,a,c,b,e};intsizesizeof(arr)/sizeof(arr[0]);qsort(arr,size,sizeof(char),compare_chars);// 使用 qsort 对字符数组进行排序for(inti0;isize;i)// 打印排序后的字符数组{printf(%c ,arr[i]);}return0;}3、排序对象是字符串类型时#includestdio.h// 用于输入输出#includestdlib.h// 用于qsort函数#includestring.h// 用于strcmp函数intcompareStrings(constvoid*p1,constvoid*p2){// 将void指针转换为指向字符串指针的指针charstr1[]* (char*)p1;charstr2[]* (char*)p2;returnstrcmp(str1,str2);// 使用strcmp比较字符串}intmain(){char*strings[]{banana,apple,orange,grape,pear};// 定义一个字符串数组intnumStringssizeof(strings)/sizeof(strings[0]);qsort(strings,numStrings,sizeof(char*),compareStrings);// 使用qsort对字符串数组进行排序for(inti0;inumStrings;i){printf(%s\n,strings[i]);// 打印排序后的结果}return0;}注意字符串比较要用strcmp函数4、排序对象是浮点型类型时#includestdio.h#includestdlib.hintcompare_floats(constvoid*a,constvoid*b)// 浮点数比较函数{floatfa*(constfloat*)a;floatfb*(constfloat*)b;// 处理浮点数精度问题if(fafb){return-1;}if(fafb){return1;}return0;}intmain(){floatnumbers[]{3.14f,1.59f,2.65f,3.58f,9.79f,3.23f};intsizesizeof(numbers)/sizeof(numbers[0]);// 使用qsort排序qsort(numbers,size,sizeof(float),compare_floats);// 打印排序结果for(inti0;isize;i){printf(%.2f ,numbers[i]);}return0;}2.2 使⽤qsort排序结构数据排序对象是结构体函数#includestdio.h// 用于输入输出#includestdlib.h// 用于qsort函数#includestring.h// 用于strcmp函数structStu//定义一个嵌套函数{charname[20];//名字intage;//年龄};//比较函数假设按照年龄来⽐较intcmp_stu_by_age(constvoid*e1,constvoid*e2){return((structStu*)e1)-age-((structStu*)e2)-age;}//strcmp - 是库函数是专⻔⽤来⽐较两个字符串的⼤⼩的//比较函数假设按照名字来⽐较intcmp_stu_by_name(constvoid*e1,constvoid*e2){returnstrcmp(((structStu*)e1)-name,((structStu*)e2)-name);}//按照年龄来排序voidtest2(){structStus[]{{zhangsan,20},{lisi,30},{wangwu,15}};intszsizeof(s)/sizeof(s[0]);qsort(s,sz,sizeof(s[0]),cmp_stu_by_age);}//按照名字来排序voidtest3(){structStus[]{{zhangsan,20},{lisi,30},{wangwu,15}};intsz(sizeof(s)/sizeof(s[0]));qsort(s,sz,sizeof(s[0]),cmp_stu_by_name);}intmain(){test2();//按照年龄来排序test3();//按照名字来排序return0;}补充结构体成员访问操作符 -通过指针间接访问结构体变量的成员structStu//定义一个嵌套函数{charname[20];//名字intage;//年龄};intmain(){structStus{zhangsan,20};structStu*xs;printf(%d\n,x-age);return0;}. 操作符用于直接访问结构体变量的成员structStu//定义一个嵌套函数{charname[20];//名字intage;//年龄};intmain(){structStus[]{zhangsan,20};printf(%d\n,s.age);return0;}结语“三连到位坐等回关~”完。

相关新闻

2026/8/20 14:14:21

汽车零售数字化转型:渠道下沉、全生命周期运营与OMO融合实战

1. 从“卖车”到“经营用户”:汽车零售的本质变迁 最近和几个在主机厂、经销商集团和新兴零售平台的朋友聊天,大家不约而同地提到一个词:焦虑。这种焦虑,不是来自销量的短期波动,而是源于一种深刻的行业共识——过去那…

2026/8/20 14:14:21

116-平台落地路线图:如果从零开始,应该先搭哪几层

适合对象:准备建设类似平台的技术负责人、架构师和工程团队。 先说结论 平台落地路线图不是一个孤立功能,而是精准测试平台里帮助团队做判断的一环。 它重点解决的是:如果从零开始,应该先搭哪几层。 用大白话讲,先把建设顺序、角色分工和长期治理讲清楚,平台才不会做成…

2026/8/20 15:24:33

本地repo与远程库部署 | 5分钟速成版

最近学到了git三剑客与github上的pull request,适用于多人多次修改的项目。其实询问AI,就会发现TA讲解得很详细了,而我这里主要做个总结与记录。以下为Linux使用场景。 目录 Git / GitHub 协作主要流程 Git中主要命令 1. 获取仓库&#xf…

2026/8/20 15:24:33

怎么下载并安装数据库mysql

1、下载地址 https://dev.mysql.com/downloads/mysql/ 2、 直接下载, mysql-9.7.1-winx64.zip 绿色免安装完整部署教程 一、前期准备 解压压缩包 把压缩包解压到无中文、无空格路径,推荐:D:\mysql-9.7.1-winx64 ⚠️ 禁止路径含中文 / 空…

2026/8/20 15:24:33

Ubuntu下部署opencv到工程里

一、背景 在项目中希望工程能快速地移植到他人的电脑里而不用手动安装配置opencv环境。所以我们需要把opencv放入工程里。 在这里,我第一时间想的就是使用opencv编译静态库: cmake -D CMAKE_BUILD_TYPERELEASE .. \-D CMAKE_INSTALL_PREFIXinstall \-D OPENCV_EXTR…

2026/8/20 15:24:33

外贸ERP怎么选:纯CRM够不够,什么时候非上“进出口一体“不可

利益相关:从事外贸ERP(汇信),下面尽量讲中立的判断框架,不吹某一家。 外贸公司选系统,最常见的误区是把“CRM/获客工具”当成“外贸管理系统”。两者解决的根本不是一回事——选错了,要么花冤枉钱,要么用一两年发现后段全靠手工,数据两张皮。 一、先分清两类系统 获客型/纯CRM(…

2026/8/20 15:24:33

Python 专栏目录索引

文章目录Python 环境搭建Python 语法 变量、print、注释和运算符Python 的基本结构Python 中的文件和文件夹操作Python 中常用库HTML文件格式Python 文件打包成 exe 可执行文件Python 常见问题及解决方案Python 应用实例PyCharm 安装虚拟环境Python 环境搭建 vscode搭建Python…

2026/8/20 10:17:13

工业通信系统底层逻辑:04 反射——高频能量撞墙之后会发生什么?

第四篇:反射——高频能量撞墙之后会发生什么? —— 你以为信号已经过去了,其实它正在回来打你 老Q的现场笔记 第五季,我们正式进入工业神经系统层。这里不再是单个设备的战斗,而是整个工厂“经脉”层面的秩序之战。从这一篇开始,你将第一次看清:看似简单的信号传播,背…

2026/8/19 15:09:57

工业传感器与变送器详解:序章 从物理世界到工业数据

序章 从物理世界到工业数据 ——重新认识工业传感器与变送器 工业自动化系统正变得日益复杂。今天的工业现场早已不是简单的控制回路,而是由多层技术共同构成的立体体系:PLC、DCS、SCADA、MES、工业互联网、边缘计算与人工智能。控制系统可以执行复杂算法,工业网络可以实现…

2026/8/20 0:01:41

Cline、Hermes、OpenClaw 都能连:HTTP 型 MCP 客户端全适配

后台被问得最多的一类问题是:“我用的是 Cline / Hermes / OpenClaw,能连察元的 WPS 文档服务吗?” 统一回答:能。而且这个"都能连"值得单独写一篇——不是我们挨个给每个客户端做了适配,而是所有这些客户端…

2026/8/20 0:01:41

46 个文档工具一次看懂:察元AI文档助手 MCP 工具目录速览

把察元AI文档助手接进 Claude Code 之后,我建议的第一件事不是急着下提示词,而是把它的 MCP 工具目录过一遍——46 个工具(MCP 目录版本 0.10.0),乍看吓人,其实按"一份文档的生命周期"分组之后非…

2026/8/20 8:35:23

实测才敢推 AI论文网站 2026最新测评与推荐

2026年真正好用的AI论文网站,核心看生成的论文质量、低AI味、格式正确、学术适配四大指标。综合实测,千笔AI、ThouPen、豆包、DeepSeek、Grammarly 是当前最值得推荐的梯队,覆盖从免费到付费、从中文到英文、从文科到理工的全场景需求。一、综…

2026/8/20 9:15:29

2026必备!AI论文网站测评:最新推荐与深度对比

2026年真正好用的AI论文网站,核心看生成的论文质量、低AI味、格式正确、学术适配四大指标。综合实测,千笔AI、ThouPen、豆包、DeepSeek、Grammarly 是当前最值得推荐的梯队,覆盖从免费到付费、从中文到英文、从文科到理工的全场景需求。 一、…

2026/8/19 16:39:34

摆脱论文困扰!盘点2026年全网爆红的的AI论文写作工具

一天写完毕业论文在2026年已不再是天方夜谭。2026年最炸裂、实测能大幅提速的AI论文写作工具,覆盖选题构思、文献整理、内容生成、格式排版等核心场景,真正帮你高效搞定论文难题。 一、全流程王者:一站式搞定论文全链路(一天定稿首…