C语言回调函数到底是什么?
很多刚学C语言的朋友看到回调函数四个字就头疼觉得这是个高深莫测的概念。其实说白了回调函数就是把一个函数当成参数传给另一个函数让它在合适的时机回头调用你传过去的函数。今天这篇文章我用最通俗的语言完整代码示例让你彻底搞懂回调函数的本质。一、回调函数到底是个啥先打个比方你点外卖的时候不可能一直盯着手机等骑手。你会告诉骑手到了给我打电话。骑手到了之后主动回调你——这就是回调的思想。在C语言里回调函数也是这个逻辑A函数把B函数的地址传给C函数C函数在合适的时机回头调用B函数。用代码来说就是函数指针作为参数。二、为什么要用回调函数回调函数的核心优势就两个字解耦。三、qsort函数回调函数的经典案例C标准库里的qsort函数就是回调函数最经典的实战案例。先看它的函数原型#include void qsort( void *base, // 待排序数组的首地址 size_t nmemb, // 数组元素个数 size_t size, // 每个元素的大小字节 int (*compar)(const void *, const void *) // 比较函数指针回调函数 );看到第四个参数了吗int (*compar)(const void *, const void *)这就是回调函数指针四、完整代码示例可直接复制运行下面这段代码演示了如何用qsort排序整数数组包含了完整的比较函数实现#include #include // 回调函数比较两个整数 int compare_int(const void *a, const void *b) { int int_a *(const int *)a; int int_b *(const int *)b; if (int_a int_b) return -1; if (int_a int_b) return 1; return 0; } int main() { int arr[] {64, 34, 25, 12, 22, 11, 90}; int n sizeof(arr) / sizeof(arr[0]); printf(排序前); for (int i 0; i n; i) { printf(%d , arr[i]); } printf(\n); // 调用qsort传入回调函数compare_int qsort(arr, n, sizeof(int), compare_int); printf(排序后); for (int i 0; i n; i) { printf(%d , arr[i]); } printf(\n); return 0; }运行结果排序前64 34 25 12 22 11 90 排序后11 12 22 25 34 64 90五、回调函数的执行流程图解main函数 │ 调用 qsort(arr, n, sizeof(int), compare_int) │ qsort内部不知道你要怎么比只管调用你传进来的函数 │ 回调 compare_int(arr[i], arr[j]) ← 这就是回调 │ compare_int返回比较结果-1, 0, 1 │ qsort根据结果调整元素位置六、进阶用同一个框架实现不同排序规则回调函数的真正威力在于灵活性。同样是qsort换个比较函数就能实现降序排列// 降序排列的比较函数 int compare_int_desc(const void *a, const void *b) { return compare_int(b, a); // 反过来比较就是降序 } // 使用qsort(arr, n, sizeof(int), compare_int_desc);甚至排序结构体数组typedef struct { char name[20]; int score; } Student; // 按分数排序 int compare_by_score(const void *a, const void *b) { Student *s1 (Student *)a; Student *s2 (Student *)b; return s1-score - s2-score; }七、总结回调函数的本质就是函数指针作为参数实现你定义规则框架来执行。搞懂回调函数你就迈过了C语言进阶的一道重要门槛。后面学事件驱动、多线程、网络编程都会用到这个思想。---觉得有用的话点个赞收藏起来慢慢看有任何问题欢迎在评论区留言讨论