当前位置: 首页 > 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.gsyq.cn/news/1606295.html

相关文章:

  • 阿里云Linux云服务器部署Oracle数据库完全指南:从环境准备到生产级优化
  • c AI人工智能自发活动视频分析系统的起源 AI人工智能自发活动分析系统
  • 【中小学AI人工智能教育】文本分类任务和情感分析
  • 蓝光3D扫描技术如何打通模具“设计-制造-验证”闭环?
  • 4路24位高精度应变片专用采集卡 力学应变测试闭环解决方案。4路24位4.8Ksps ADC,支持全桥、半桥、1/4桥,4路16位DA,4路DO。
  • Apifox AI 赋能接口测试:从文档解析到自动化用例生成的智能实践
  • CasaOS深度体验:个人云服务器从零搭建到稳定运维全指南
  • Claude Code 安装使用完整教程(2026最新版)
  • Bradykinin (1-6) ;Arg-Pro-Pro-Gly-Phe-Ser
  • Agent 的下半场,该给它装个身体了
  • 企业级智能体如何解决传统自动化的“认知-执行断层”:2026年深度技术拆解与落地指南
  • 获千万级Pre-A轮融资,光速一构要把汽车流水线搬进弹性体3D打印工厂
  • Git 查 Bug 显微镜:如何精准追踪类、结构体与枚举定义的历史变动?
  • C++ ASCII 3D无尽跑酷游戏
  • 变频器干扰导致模拟量漂移怎么办?高精度隔离保护器隔离杂波,防护 PLC 通道
  • 如何用猫抓浏览器扩展轻松捕获网页视频音频资源:新手完整指南
  • TI BASSensors MKII开发板实战:多传感器集成与嵌入式系统快速原型开发
  • 全屋智能售后口碑好的品牌推荐
  • 为什么9成技术管理者悄悄续费ChatGPT Plus?(内部采购评估SOP首次公开)
  • MySQL 事务锁冲突排查思路
  • 【Springboot毕设全套源码+文档】springboot基于人脸识别的智慧医疗预约挂号平台的设计与实现(丰富项目+远程调试+讲解+定制)
  • 全球首批 AI Worker 上岗:星尘浩宇海外金融审核项目稳定运行 300 天
  • Windows 11 文件资源管理器提速教程:KB5095093 更新后如何手动启用新功能
  • Agent 记不住业务数据?用 Store 给它加个“笔记本“!
  • PostgreSQL 和 MySQL InnoDB:主键索引到底需不需要“回表”?
  • TrollInstallerX终极指南:3分钟完成iOS TrollStore快速安装的完整教程
  • DeepPCB:1500对图像数据集,开启PCB缺陷检测的AI时代
  • 【计算机毕业设计】Harcend学习网站的设计与实现
  • GPT-4稀疏激活原理:MoE架构与动态路由技术解析
  • 怎样永久激活IDM下载工具:3步实用教程告别试用限制