1.回调函数
1.1定义
回调函数就是通过函数指针而被调用的函数
把函数的指针(地址)作为参数传递给另⼀个函数,当这个指针被⽤来调⽤其所指向的函数 时,被调⽤的函数就是回调函数
回调函数不是由该函数的实现⽅直接调⽤,⽽是在特定的事件或条 件发⽣时由另外的⼀⽅调⽤的,⽤于对该事件或条件进⾏响应
1.2示例
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>int Add(int x, int y)
{return x + y;
}int Sub(int x, int y)
{return x - y;
}void Cacl(int (*func)(int, int))
{printf("请输入两个操作数:");int y = 0;int x = 0;scanf("%d %d", &x, &y);int ret = func(x, y);printf("%d\n", ret);
}void menu()
{printf("**********************\n");printf("*** 1.Add 2.Sub ***\n");printf("*** 0.Out ****\n");printf("**********************\n");
}
int main()
{int input;do{menu();printf("请选择:");scanf("%d", &input);switch (input){case 1:Cacl(Add);break;case 2:Cacl(Sub);break;case 0:printf("已退出计算器\n");break;default:printf("选择有误,请重新选择\n");}} while (input);return 0;
}
这是一个只实现了加减法的简易计算器
用户输入input之后,
调用相应的Cacl函数
Cacl函数接收用于计算加减法函数的地址
并在内部进行相应加减法函数的调用
此时,被调用的加减法函数就叫做回调函数
此时的Add函数就叫做回调函数
在这个过程中,我们并不是直接调用了Add函数
而是通过函数指针调用了Add函数
再看下面这句话,你就有更深的理解了
回调函数不是由该函数的实现⽅直接调⽤,⽽是在特定的事件或条 件发⽣时由另外的⼀⽅调⽤的,⽤于对该事件或条件进⾏响应
2.qsort函数
qosrt函数可以对任意类型的数据进行升序或者降序排序
2.1qsort函数的介绍
I参数
因为不知道要传入的是什么类型的指针,
所以统一使用 void* 来接收
从左往右,要传入的
第一个参数是 待排序数组的第一个元素的地址
第二个参数是 元素个数
第三个参数是 每个元素的大小,单位是字节
第四个参数是 一个函数指针
qsort函数通过这个函数指针调用相关的函数
qsort函数要调用的函数是程序员自己写的
因为
不同的类型有不同的比较方式
字符串、结构体的排序
不能粗暴的使用< > != ==进行比较
整型、浮点型的排序可以
程序员自己写的函数就是实现数据比较方式的函数
这样qosrt函数就没必要实现多种数据的比较
只需要根据该函数的返回值进行相关的操作即可
程序员自己写的函数的要求 :
(1)程序员自己写的函数应该与函数指针的类型保持一致
下面是一个正确的函数声明
声明时,形参名可以不写int cmp_int(const void*p1,const void*p2);
这是想声明一个实现整型比较的函数
该函数返回值为int,形参为(const void*p1,const void*p2)
(1.2)
p1指向一个数组元素
p2指向的是p1指向的元素之后的第一个元素
(2)函数内部的要求:
(2.1)void*不能直接解引用或+-整数操作
所以需要根据需求进行相应的显式类型转换
(2.2)显示类型转换后,
当p1指向的内容大于p2时,函数返回 大于0的值
当p1指向的内容小于p2时,函数返回 大于0的值
当p1指向的内容等于p2时,函数返回 0
2.2qsort函数的使用
qsort函数的使用需要包含头文件<stdlib.h>
#include <stdio.h>
#include <stdlib.h>int cmp_int(const void* p1, const void* p2)
{return *((int*)p1) - *((int*)p2);
}
int main()
{int arr[] = { 1,3,8,6,4,7,9,5,2,0 };int sz = sizeof(arr) / sizeof(arr[0]);qsort(arr, sz, sizeof(arr[0]), cmp_int);for (int i = 0; i < sz; ++i)printf("%d ", arr[i]);return 0;
}
这行代码调用了qsort函数
这段代码实现了整型函数的比较方式:
(1)将p1、p2显示类型转换为 int*
(2)解引用后相减
(3)然后可以直接返回
这就实现了升序排序
当然也可以降序:只需要将
*((int*)p1) - *((int*)p2)
改为
*((int*)p2) - *((int*)p1)
这就实现了降序
上面是实现了整型排序:
下面展示字符串
p1、p2指向的是一个字符串,即指向了一个指针
那显示制转换为二级指针,再进行解引用操作
总结:
qsort函数使用的重点是
实现 数据类型比较 的函数