当前位置: 首页 > news >正文

指针(4)

一。回调函数

核心结论:回调函数就是一个通过函数指针调用的函数

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

上篇文章我们写了一个计算机函数,用switch写有点冗余,可以将运算函数的地址作为参数传给另一个函数以此来简化代码,如下图:

Add等运算函数作为指针(地址)传给culu函数,那么Add等函数就是回调函数

二。qsort使用举例

函数说明:它是一个库函数,是用来对数据进行排序的(基于快速排序的思想对数据进行排序的),本质上是冒泡排序。它可以对任意类型的 数据进行排序。

这里面的int (*compar)(const void*, const void*)就是回调函数,我们需要写一个函数,这个函数是的作用是提供比较规则,传给qsortqsort会在排序时自动调用你的比较函数,来决定两个元素谁大谁小。

注意:比较函数的返回值要能体现出p1和p2指向的数组的大小

p1指向的数据>p2指向的数据,返回大于0的数字

p1指向的数据<p2指向的数据,返回小于0的数字

p1指向的数据=p2指向的数据,返回等于0的数字

(1)用qsort排序整型数据

这里的com_int就是回调函数,qsort在排序过程中会反复调用它来比较两个数的大小。

(2)qsort排序结构体

三.qsort的模拟实现

核心逻辑分析:(1)参数分析:如果要对任意数据进行排列,那么数组的类型就不能是具体的类型,那么就可以把接收数组的指针设置为 void* ,这种指针类型可以接收任意类型数据的地址,完美我们想对任意数据排列的需求。比较数据的话肯定不止一个数据,所以需要把元素个数也作为参数传过去。因为前面我们的形参是void*,所以我们的实参要有元素的大小。最后,对于不同的数据,比较的方法也不一样,所以参数还要有一个函数提供比较方法。

(2)代码逻辑分析:两层循环是冒泡排序的实现逻辑。对于base中的各个数据,因为开始时我们不知道数据的具体类型,但我们要通过下标找到对应的元素,所以我们可以通过强制转换,将base的类型由void*转化为char*类型,再通过加 j*width就可以找到对应下标的元素。然后if语句判断,如果条件成立,进入swap函数

将传过来的形参转化为char*的原因是char是 1 字节类型,(char*)buf1会把地址按 “1 字节为单位” 来访问,循环size次,逐字节交换两个元素的内存内容,不管元素是什么类型都能交换

例如交换一个整型,一次交换一个字节,循环四次,刚好能交换一整个整型数据。然后cmp函数就根据用户具体需求书写即可,这里以比较整型数据为例,完整代码如下图:

http://www.jsqmd.com/news/1046436/

相关文章:

  • JavaSE基础总结(2)
  • 2026衡阳漏水检测维修精选优质服务商TOP5推荐!卫生间漏水/厨房漏水/屋顶天花板漏水/阳台漏水/地下室漏水防水补漏检测维修-正规防水补漏公司优选口碑榜测评推荐 - 即刻修防水
  • 2026年|如何高效降低论文AI检测率?三招助你轻松通过Turnitin检测
  • 如何快速实现微信聊天记录本地解析:完整技术指南与数据留痕解决方案
  • Obsidian 0x04:构建高效知识工作流的插件生态
  • Transformer 发明者加入 OpenAI、创业板创历史新高、微信给 AI 发“钱包“
  • AMD 780M核显Windows本地部署ComfyUI实战指南
  • AI设计Agent实战:用边缘硬件替代Lovart的可控工作流
  • 司马法“用众若寡”:从“人海战术”到“集群算法”的组织效能革命
  • 【毕业设计】基于SpringBoot 的运动服装进销存管理系统搭建 潮流运动服饰电商销售服务系统的设计与落地(源码+文档+远程调试,全bao定制等)
  • Linux Pulseaudio深度解析之pa_mainloop_get_api调用流程与实战(六十七)
  • 5步构建AI驱动的股票智能分析系统:从零到自动化决策支持
  • (2026新)湘潭正规防水补漏公司口碑榜TOP5权威推荐!卫生间/厨房/阳台/屋顶/天花板/地下室渗漏水检测维修攻略-靠谱漏水检测维修师傅推荐 - 安佳防水
  • 深入解析NXP LPC210x系列ARM7微控制器:从核心架构到外设实战
  • 如何在VS Code中实现办公文档一体化处理?vscode-office插件深度解析
  • MC9S12KG128 Flash底层操作:命令序列与FSTAT寄存器实战解析
  • OpenClaw装好了不知道干什么?我让它把家里的NAS、电脑和AI全串起来了
  • [自动化]AutoJS——Android自动化工具
  • NXP KMZ80磁角度传感器:从磁阻效应到汽车级SENT协议应用
  • 2026衢州本地人必选防水补漏检测维修公司靠谱服务商TOP5推荐:房屋渗漏水检测维修/卫生间/厨房/天花板/阳台/外墙渗漏水检测补漏维修-暗管漏水检测专业仪器精准定位漏水点 - 即刻修防水
  • 分布式游戏服务器架构设计:基于.NET 8.0的OpenMir2传奇服务器技术实现方案
  • Python计算机毕设之基于 Django 的体育赛事资讯发布及售票系统的设计与实现 面向互联网的球类赛事智能购票管理系统(完整前后端代码+说明文档+LW,调试定制等)
  • (2026新)淮安正规防水补漏公司口碑榜TOP5权威推荐!卫生间/厨房/阳台/屋顶/天花板/地下室渗漏水检测维修攻略-靠谱漏水检测维修师傅推荐 - 安佳防水
  • (2026新)温州正规防水补漏公司口碑榜TOP5权威推荐!卫生间/厨房/阳台/屋顶/天花板/地下室渗漏水检测维修攻略-靠谱漏水检测维修师傅推荐 - 安佳防水
  • MC68HC908QY/QT时钟系统深度解析:从振荡器原理到实战配置
  • JSON最小化实际应用场景案例
  • 《2026 AI 数字人直播系统 TOP10 实测:监管收紧下,长效运营谁是合规标杆?》
  • 收藏!小白程序员必看:Agent性能优化五大维度,让你的大模型跑起来!
  • 2026衡阳本地人必选防水补漏检测维修公司靠谱服务商TOP5推荐:房屋渗漏水检测维修/卫生间/厨房/天花板/阳台/外墙渗漏水检测补漏维修-暗管漏水检测专业仪器精准定位漏水点 - 即刻修防水
  • DCAFE双坐标注意力机制详解:提升YOLO小目标检测精度