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

C语言指针详解4

一.回调函数

回调函数就是通过函数指针调用的函数。如果把函数指针作为参数传递给另外一个函数,当这个指针被用来调用其所指向的函数时,被调用的函数就是回调函数。回调函数不是有该函数的实现方(谁写出函数内部完整执行逻辑,谁就是该函数的实现方;只拿来调用、不写内部代码的是调用方。)直接调用,而是在特定的时间或条件发生时由另一方调用。

示例:

#include <stdio.h> int calculate(int a, int b, int (*cb)(int, int)) { return cb(a, b); } int add(int x, int y) { return x + y; } int sub(int x, int y) { return x - y; } int mul(int x, int y) { return x * y; } int main() { int a = 10, b = 3; printf("加法:%d\n", calculate(a, b, add)); printf("减法:%d\n", calculate(a, b, sub)); printf("乘法:%d\n", calculate(a, b, mul)); return 0; }

在这段代码中,add,sub,mul是函数的实现方,他们定义完了之后并没有在实现方(及函数内部)直接调用,而是在caculate中被函数指针cb调用,所以他们三个是回调函数。

二.qsort函数的使用

qsort是一个库函数,是用来对数据进行排序的,qsort函数能排序任意类型的数据,它是基于快速排序的思想进行排序的。对应的头文件是<stdlib.h>

函数原型:

void qsort(void *base, size_t num, size_t size, int (*compar)(const void *, const void *));

1.base:待排序的首地址元素。

2.num:数组元素个数

3.size:单个元素占用字节元素大小

4.函数指针:比较函数。

5.比较函数:int cmp(const void *a, const void *b)

6.降序只需交换a,b:return *(int*)b - *(int*)a;

示例

#include <stdio.h> #include <stdlib.h> // 整型升序比较函数 int cmp_int(const void* a, const void* b) { // 强制转int*解引用相减 return *(int*)a - *(int*)b; } int main() { int arr[] = { 5, 2, 9, 1, 5, 6 }; int len = sizeof(arr) / sizeof(arr[0]); qsort(arr, len, sizeof(int), cmp_int); for (int i = 0; i < len; i++) { printf("%d ", arr[i]); } return 0; }
三.模拟实现(冒泡排序):
#include <stdio.h> void Swap(char* buf1, char* buf2,size_t width) { size_t i = 0; for (i = 0; i < width; i++) { char tmp = *buf1; *buf1 = *buf2; *buf2 = tmp; buf1++; buf2++; } } int cmp_int(const void* p1, const void* p2) { return (*(int*)p1 - *(int*)p2); } void bubble_sort(void* base,size_t sz,size_t width,int (*cmp) (const void* p1,const void *p2)) //参数:1.排序的数组。2.数组长度。3.数组中每个元素的大小(字节数)4.比较函数-函数指针 { int i = 0; for (i = 0; i < sz - 1; i++) { int j = 0; for (j = 0; j < sz - 1 - i; j++) { //下标为j和j+1这两个元素 //升序 if (cmp((char*)base + j * width,(char*)base + (j + 1)* width )> 0) { //交换 Swap((char*)base + j * width, (char*)base + (j + 1) * width,width); } } } } int print_arr(int* arr,int sz) { int i = 0; //确定趟数 for (int i = 0; i < sz - 1; i++) { printf("%d ",arr[i]); } printf("\n"); } void test() { int arr[] = { 8,7,6,5,4,3,2,9,1,0 };//0 1 2 3 4 5 6 7 8 9 //对数组进行排序 - 升序 int sz = sizeof(arr) / sizeof(arr[0]); print_arr(arr, sz); bubble_sort(arr, sz, sizeof(arr[0]), cmp_int); print_arr(arr, sz); } int main() { test(); return 0; }
http://www.jsqmd.com/news/1094335/

相关文章:

  • 基于个人微信接口的流式同步方案,扩充 AI 知识库素材
  • TI RF-BREAKOUT-MVK模块:射频总线硬件调试与协议分析的实战指南
  • WebPack源码泄露:从Source Map安全风险到全链路防御实战
  • 科研制图告别熬夜调试!Okbiye 双赛道 AI 绘图工作台一站式搞定全学科期刊图表
  • 阿里云Linux云服务器部署Oracle数据库完全指南:从环境准备到生产级优化
  • 告别停车拥堵与管理难题!自动停车收费系统,解锁智慧车场新范式
  • c AI人工智能自发活动视频分析系统的起源 AI人工智能自发活动分析系统
  • MPT-7B开源长上下文模型深度解析:ALiBi、FlashAttention与Apache 2.0工程实践
  • safeguard-web深度解析:10个核心功能助您高效管理服务器
  • 计算机毕业设计之基于ssm框架的校园快递物流管理系统
  • 嵌入式安全:安全启动与硬件信任根的实现
  • 吃透电钢琴键盘逻辑,5款高手感电钢琴推荐,新手零失误选购
  • 【中小学AI人工智能教育】文本分类任务和情感分析
  • 2026年八款高人气CRM实测横评:为成长型企业寻找最佳业务引擎
  • 蓝光3D扫描技术如何打通模具“设计-制造-验证”闭环?
  • 用30行Python代码实现实时运动检测!OpenCV+MOG2+开运算,摄像头下无所遁形(万字详解可复制)
  • 预算有限闭眼入!2026学生专属吉他选购推荐,省钱耐用好上手
  • 游戏陪玩小程序开发功能玩法分析:电竞社交、订单匹配与商业落地
  • 从华为到创业:两个光器件专家的十年国产替代之路
  • CasaOS深度体验:个人云服务器从零搭建到稳定运维全指南
  • Apifox AI 赋能接口测试:从文档解析到自动化用例生成的智能实践
  • 4路24位高精度应变片专用采集卡 力学应变测试闭环解决方案。4路24位4.8Ksps ADC,支持全桥、半桥、1/4桥,4路16位DA,4路DO。
  • 基于Phi-3-mini与OpenClaw的AI驱动自动化测试实践
  • 轻量级性能优化工具完全指南:释放硬件潜能的终极方案
  • Agent 的下半场,该给它装个身体了
  • SQL注入攻防全解析:从基础原理到高级绕过与实战防御
  • Claude Code 安装使用完整教程(2026最新版)
  • Bradykinin (1-6) ;Arg-Pro-Pro-Gly-Phe-Ser
  • IP被禁用怎么解决?原因解析 + 修复方法 + 预防指南(2026最新)
  • 数据库审计不是记流水账:先锁定高危动作与关键对象,再谈数据集与工具落地