【C指针(五)】6种转移表实现整合longjmp()/setjmp()函数和qsort函数详解分析&&模拟实现2:https://developer.aliyun.com/article/1474741
二、回调函数是什么?
C语言中的回调函数是指在函数调用的过程中,被另外一个函数作为参数传递并调用的函数。
回调函数的主要特征如下:
- 回调函数必须事先定义。
- 回调函数的地址作为参数传递给另一个函数,这个函数称为主函数。
- 主函数在适当的时候,通过调用回调函数的地址来调用回调函数。
一个典型的回调函数使用场景例子:
// 回调函数定义 void callback_func(int value) { printf("value is %d\n", value); } // 主函数定义 void main_func(void (*callback)(int)) { int num = 10; // 调用回调函数 callback(num); } int main() { // 注册回调函数 main_func(callback_func); return 0; }
注:回调函数的特点是函数的调用关系由使用者在运行时决定,而不是在编译时就确定,这提供了更大的灵活性。
那可不可以使用回调函数实现计算器呢?
- 定义一个通用的计算函数
calc
,它接收一个函数指针作为参数。- 在
main
函数中,根据用户选择直接调用calc
函数,并传入相应的运算函数。- 回调函数是
Add、Sub、Mul、Div
void menu() { printf("******************************\n"); printf("**** 1. add 2. sub ****\n"); printf("**** 3. mul 4. div ****\n"); printf("**** 0. exit ****\n"); printf("******************************\n"); } 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 Div(int x, int y) { return x / y; } //calc功能强大了 void calc(int (*pf)(int,int)) { int x = 0; int y = 0; int ret = 0; printf("请输入两个操作数:"); scanf("%d %d", &x, &y); ret = pf(x, y); printf("%d\n", ret); } int main() { int input = 0; do { menu(); printf("请选择:"); scanf("%d", &input); switch (input) { case 1: calc(Add);//完成计算 break; case 2: calc(Sub); break; case 3: calc(Mul); break; case 4: calc(Div); break; case 0: printf("退出计算器\n"); break; default: printf("选择错误,重新选择\n"); break; } } while (input); return 0; }
三、qsort函数细解
3.1 类比冒泡排序?通过前面我们学过冒泡排序,qsort
函数的排序让我们类比一下:
void bubble_sort(int arr[], int sz) { //趟数 int i = 0; for (i = 0; i < sz - 1; i++) { //一趟冒泡排序的过程 //两两相邻元素的比较 int j = 0; for (j = 0; j < sz - 1 - i; j++) { if (arr[j] > arr[j + 1]) { int tmp = arr[j]; arr[j] = arr[j + 1]; arr[j + 1] = tmp; } } } } void print_arr(int arr[], int sz) { int i = 0; for (i = 0; i < sz; i++) { printf("%d ", arr[i]); } printf("\n"); } int main() { //将一组整数排序为升序 int arr[10] = { 3,1,5,2,4,6,8,7,0,9 }; int sz = sizeof(arr) / sizeof(arr[0]); print_arr(arr, sz); bubble_sort(arr, sz); print_arr(arr, sz); return 0; }
3.2 qosrt函数超详解
库函数的学习和查看⼯具很多,⽐如:
C/C++官⽅的链接:https://zh.cppreference.com/w/c/header
cplusplus.com:https://legacy.cplusplus.com/reference/clibrary/
qsort函数是C标准库中用于对数组进行快速排序的函数。(注:qsort函数底层使用的排序算法就是快速排序。)
- 函数原型:
void qsort( void* base,//base 指向了要排序的数组的第一个元素 size_t num, //base指向的数组中的元素个数(待排序的数组的元素的个数) size_t size,//base指向的数组中元素的大小(单位是字节) int (*compar)(const void*p1, const void*p2)//函数指针 - 指针指向的函数是用来比较数组中的2个元素的 );
.- [ ] 分析定义:
base指向要排序的数组首地址。
num表示数组元素个数。
size表示每个元素的大小,以字节为单位。
compar是比较函数,它接收两个void指针,返回值小于0表示第一个参数小于第二个参数,等于0表示相等,大于0表示第一个参数大于第二个参数。
] 特点:
qsort使用快速排序算法,时间复杂度为O(nlogn)。
调用qsort时,需要提供一个比较函数compar来判断两个元素的大小关系。
比较函数通过void指针间接访问元素,避免与数据类型绑定,实现了最大程度的通用性。
qsort会在内部调用比较函数多次对数组进行排序,这就是回调机制的实现。
qsort是inplace排序,不需要额外的空间。
【C指针(五)】6种转移表实现整合longjmp()/setjmp()函数和qsort函数详解分析&&模拟实现4:https://developer.aliyun.com/article/1474743