尧图网站建设 尧图网络
  • 首页
  • 关于我们
  • 服务项目
  • 案例展示
  • 建站流程
  • 资讯中心
  • 联系我们
首页/资讯中心/详情

指针(4)

指针(4)
📅 发布时间:2026/6/20 4:50:46

一。回调函数

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

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

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

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

二。qsort使用举例

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

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

注意:比较函数的返回值要能体现出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函数就根据用户具体需求书写即可,这里以比较整型数据为例,完整代码如下图:

相关新闻

  • 2026年|如何高效降低论文AI检测率?三招助你轻松通过Turnitin检测
  • Transformer 发明者加入 OpenAI、创业板创历史新高、微信给 AI 发“钱包“
  • Linux Pulseaudio深度解析之pa_mainloop_get_api调用流程与实战(六十七)

最新新闻

  • CVE-2026-42897漏洞深度解析:Exchange OWA XSS攻击链与实战防御指南
  • SoC内存仲裁器设计:TDMA、优先级与轮询混合调度实战解析
  • Docker 容器化部署 ZeroTier:打造跨平台私有网络接入点
  • Wireshark在渗透测试中的实战应用:从流量分析到漏洞挖掘
  • Flutter UI自动化测试实战:从原理到选型,构建稳定高效的测试体系
  • AI测试智能体实战:五步法提升测试覆盖率45%

日新闻

  • 信任的进化:技术实现详解——如何用JavaScript构建博弈论模拟器
  • Terrakube自定义工作流:如何集成OPA、Infracost等工具扩展IaC能力
  • grunt-concurrent快速入门:5分钟学会并行运行Grunt任务

周新闻

  • 3步解锁iOS设备:applera1n激活锁绕过完全指南
  • 39 2026 人工智能证书终极盘点,普通人选 AI 证书可以从这些方向入手
  • Redis 暴露公网有多危险?从端口检查到补救步骤

月新闻

  • 【总结】入门篇:50句话让你记住架构核心概念
  • WeChatMsg技术方案解析:实现Mac微信数据自主管理的完整解决方案
  • WeChatMsg:革新性微信数据备份方案,打造你的专属数字记忆库

关于尧图

  • 公司简介
  • 团队介绍
  • 企业文化
  • 荣誉资质

服务项目

  • 定制开发
  • 电商建站
  • UI 设计
  • 运维服务

快速链接

  • 案例展示
  • 建站流程
  • 常见问题
  • 资讯中心

联系方式

  • 📍北京市朝阳区互联网产业园 A 座 10 层
  • 📞400-888-8888
  • ✉️contact@rkmt.cn
  • 🕐周一至周日 9:00-21:00

© 2024 北京尧图网络科技有限公司 版权所有 | 京 ICP 备 XXXXXXXX 号