C语言——深度理解指针(5)

发布时间:2026/8/20 14:19:20

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;}结语“三连到位坐等回关~”完。

相关新闻

SpringAI的简单理解

SpringAI的简单理解

2026/8/20 14:09:20

SpringAI Spring AI 是 Spring 官方针对人工智能(AI)应用开发推出的标准化框架。 它的核心宗旨是将 Spring 开发者熟悉的“依赖注入、统一抽象、声明式配置、面向接口编程”等生态优势,完美复刻到 AI 和大模型开发领域。 Java 程序员&…

大模型上下文管理实战:5种压缩策略对抗Context Rot

大模型上下文管理实战:5种压缩策略对抗Context Rot

2026/8/20 14:09:20

1. 先搞清楚“上下文管理”到底在管什么 如果你用过 ChatGPT、Claude 这类大模型,肯定遇到过对话太长后,模型开始“胡言乱语”的情况:它要么忘记你开头说了什么,要么把不同角色的对话内容搞混,甚至开始凭空捏造信息。这…

ARM架构下进程和线程的核心区别(切换+创建)

ARM架构下进程和线程的核心区别(切换+创建)

2026/8/20 14:09:20

疑问:为什么进程的切换开销比线程大? 进程切换全流程 1. 触发调度,进入内核态进程 A 正在用户态运行,CPU 接到中断信号。硬件自动保存现场: 在进入内核异常处理程序前,CPU 硬件会自动完成以下原子操作&…

3 分钟跑通 IBM Plex 字体:从系统安装到多语言网页实战

3 分钟跑通 IBM Plex 字体:从系统安装到多语言网页实战

2026/8/20 15:09:22

3 分钟跑通 IBM Plex 字体:从系统安装到多语言网页实战 【免费下载链接】plex The package of IBM’s typeface, IBM Plex. 项目地址: https://gitcode.com/gh_mirrors/pl/plex IBM Plex 字体是 IBM 开源的全球企业字体家族,覆盖 Sans、Serif、Mo…

python的运筹学工业场景模拟第七十三篇:对已求解线性规划,扰动某一项资源上限,批量计算多组扰动下最优目标值,绘制影子价格变化表。

python的运筹学工业场景模拟第七十三篇:对已求解线性规划,扰动某一项资源上限,批量计算多组扰动下最优目标值,绘制影子价格变化表。

2026/8/20 15:09:22

影子价格“体检仪”:用Python批量扰动资源上限,让PuLP告诉你“多一吨原料值多少钱” “某饲料厂用 PuLP 做日排产优化,模型跑得飞快,但厂长总问:‘如果再给我 1 吨玉米,利润能多多少?’ 我得手动…

官网购买mathcad prime 7.0

官网购买mathcad prime 7.0

2026/8/20 15:09:22

主要就是购买——填写姓名联系电话和地址,特别是邮箱必须正确——用支付宝进行支付,邮箱会收到产品编号order number和product code,安装,运行后进行申请注册文件,必须用前面的用户名邮箱地址等注册一个用户,然后邮箱收到授权文件。 远程桌面情况下安装的mathcad显示这个…

让付费专辑永不消失:喜马拉雅音频下载工具xmly-downloader-qt5上手实录

让付费专辑永不消失:喜马拉雅音频下载工具xmly-downloader-qt5上手实录

2026/8/20 15:09:22

让付费专辑永不消失:喜马拉雅音频下载工具xmly-downloader-qt5上手实录 【免费下载链接】xmly-downloader-qt5 喜马拉雅FM专辑下载器. 支持VIP与付费专辑. 使用GoQt5编写(Not Qt Binding). 项目地址: https://gitcode.com/gh_mirrors/xm/xmly-downloader-qt5 …

方程的根与伽罗瓦群

方程的根与伽罗瓦群

2026/8/20 15:09:22

一: 序言算算术和解方程其难度是不一样的.有一种计算,是不对称的, 比如你想好了一个数3, 让我猜, 我肯定不知道了,会问,给个提示吧? 你心里算了一下: 3*53*3*38 32 你说 这个数乘以5,再加上这个数的3次方再加上8等于32, 你猜这个数是多少?我于是会列出这个式子: 5x x^3 8…

魔兽争霸3还能再战十年:WarcraftHelper免费辅助工具,一次解决现代电脑上的兼容性难题

魔兽争霸3还能再战十年:WarcraftHelper免费辅助工具,一次解决现代电脑上的兼容性难题

2026/8/20 14:59:22

魔兽争霸3还能再战十年:WarcraftHelper免费辅助工具,一次解决现代电脑上的兼容性难题 【免费下载链接】WarcraftHelper Warcraft III Helper , support 1.20e, 1.24e, 1.26a, 1.27a, 1.27b 项目地址: https://gitcode.com/gh_mirrors/wa/WarcraftHelpe…

【文章复现】非线性值迭代自适应动态规划(ADP):离散时间非线性系统的策略迭代自适应动态规划算法研究附Matlab代码

【文章复现】非线性值迭代自适应动态规划(ADP):离散时间非线性系统的策略迭代自适应动态规划算法研究附Matlab代码

2026/8/19 3:36:59

✅作者简介:热爱科研的Matlab仿真开发者,擅长毕业设计辅导、数学建模、数据处理、建模仿真、程序设计、完整代码获取、论文复现及科研仿真。🍎 往期回顾关注个人主页:Matlab科研工作室👇 关注我领取海量matlab电子书和…

【双层规划,节点出清价,绿证交易,CVaR方法】两级电力市场环境下计及风险的省间交易商最优购电模型附Matlab代码

【双层规划,节点出清价,绿证交易,CVaR方法】两级电力市场环境下计及风险的省间交易商最优购电模型附Matlab代码

2026/8/19 9:17:18

✅作者简介:热爱科研的Matlab仿真开发者,擅长毕业设计辅导、数学建模、数据处理、建模仿真、程序设计、完整代码获取、论文复现及科研仿真。🍎 往期回顾关注个人主页:Matlab科研工作室👇 关注我领取海量matlab电子书和…

隐式mpc+自适应mpc+时变mpc,线性时变模型预测控制附Simulink仿真

隐式mpc+自适应mpc+时变mpc,线性时变模型预测控制附Simulink仿真

2026/8/19 8:02:16

✅作者简介:热爱科研的Matlab仿真开发者,擅长毕业设计辅导、数学建模、数据处理、建模仿真、程序设计、完整代码获取、论文复现及科研仿真。🍎 往期回顾关注个人主页:Matlab科研工作室👇 关注我领取海量matlab电子书和…

微信聊天记录如何完整导出?WeChatMsg备份指南:HTML/Word/CSV一键转换

微信聊天记录如何完整导出?WeChatMsg备份指南:HTML/Word/CSV一键转换

2026/8/20 0:08:45

微信聊天记录如何完整导出?WeChatMsg备份指南:HTML/Word/CSV一键转换 【免费下载链接】WeChatMsg 提取微信聊天记录,将其导出成HTML、Word、CSV文档永久保存,对聊天记录进行分析生成年度聊天报告 项目地址: https://gitcode.com…

B站缓存m4s打不开?m4s-converter无损合成MP4,实测1.46GB仅5秒

B站缓存m4s打不开?m4s-converter无损合成MP4,实测1.46GB仅5秒

2026/8/20 0:08:45

B站缓存m4s打不开?m4s-converter无损合成MP4,实测1.46GB仅5秒 【免费下载链接】m4s-converter 一个跨平台小工具,将bilibili缓存的m4s格式音视频文件合并成mp4 项目地址: https://gitcode.com/gh_mirrors/m4/m4s-converter 判断你是否…

告别白模时代:Blender3mfFormat 让 3MF 导入导出一次跑通设计到打印

告别白模时代:Blender3mfFormat 让 3MF 导入导出一次跑通设计到打印

2026/8/20 0:08:45

告别白模时代:Blender3mfFormat 让 3MF 导入导出一次跑通设计到打印 【免费下载链接】Blender3mfFormat Blender add-on to import/export 3MF files 项目地址: https://gitcode.com/gh_mirrors/bl/Blender3mfFormat 按 3MF 官方规范的字面意思,一…

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

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

2026/8/17 12:00:53

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

导师推荐!2026最新AI论文工具测评与实用推荐

导师推荐!2026最新AI论文工具测评与实用推荐

2026/8/15 10:10:27

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

告别游戏崩溃:XCOM 2模组管理器的智能革命

告别游戏崩溃:XCOM 2模组管理器的智能革命

2026/8/18 12:20:24

告别游戏崩溃:XCOM 2模组管理器的智能革命 【免费下载链接】xcom2-launcher The Alternative Mod Launcher (AML) is a replacement for the default game launchers from XCOM 2 and XCOM Chimera Squad. 项目地址: https://gitcode.com/gh_mirrors/xc/xcom2-lau…