一:回调函数
1:回调函数的定义
回调函数就是通过函数指针调用的那个函数。
如果把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用来调用它所指向的函数时,这个所调用的函数即使回调函数。回调函数不是由该函数的实现方直接调用,而是在特定的事件或条件发生时由另外的一方调用的,用于对该事件的使用
2:回调函数应用举例-简单计算器的实现
#include<stdio.h> void menu() { printf("*****************************\n"); printf("*****1 add 2 sub***********\n"); printf("*****3 mul 4 div***********\n"); printf("*****0 exit **************\n"); printf("*****************************\n"); } void calc(int (*p)(int x, int y)) { int ret = 0; int a = 0; int b = 0; printf("请输入两个操作数:"); scanf("%d %d", &a, &b); ret = p(a, b);//通过p指针调用函数 //如果输入input=1;调用的函数就是add //通过指针p调用add函数,add函数就称为回调函数 printf("%d\n", ret); } 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; } int main() { int input = 0; do { menu(); printf("请选择:"); scanf("%d", &input); switch (input) { case 1: calc(add);//add函数作为calc函数的参数 break; case 2 : calc(sub);//sub函数作为calc函数的参数 break; case 3: calc(mul);//mul函数作为calc函数的参数 break; case 4: calc(div);//div函数作为calc函数的参数 break; case 0: printf("退出计算器\n"); break; default: printf("选择错误,重新选择\n"); break; } } while (input); return 0; }
***************************** *****1 add 2 sub*********** *****3 mul 4 div*********** *****0 exit ************** ***************************** 请选择:1 请输入两个操作数:2 3 5 ***************************** *****1 add 2 sub*********** *****3 mul 4 div*********** *****0 exit ************** ***************************** 请选择:2 请输入两个操作数:4 2 2 ***************************** *****1 add 2 sub*********** *****3 mul 4 div*********** *****0 exit ************** ***************************** 请选择:3 请输入两个操作数:4 3 12 ***************************** *****1 add 2 sub*********** *****3 mul 4 div*********** *****0 exit ************** ***************************** 请选择:4 请输入两个操作数:8 4 2 ***************************** *****1 add 2 sub*********** *****3 mul 4 div*********** *****0 exit ************** ***************************** 请选择:6 选择错误,重新选择 ***************************** *****1 add 2 sub*********** *****3 mul 4 div*********** *****0 exit ************** ***************************** 请选择:0 退出计算器
二:qsort函数
qsort是一个库函数,使用时需要头文件stdlib,qsort函数用于对数据进行排序,可以排序任意类型的数据。
qsort函数有4个参数 void qsort(void* base, //base指向待排序的第一个元素的地址 size_t num, //待排序的元素个数(base指向空间的数组的个数) size_t size, //待排序的数组元素的大小,单位是字节 int (*compar)(const void* e1, const void* e2) compar是一个函数指针,指向的函数能够比较2个元素 int (*)(const void *e1,const void* e2)是函数指针类型 void* 是一种函数指针类型,是通用指针类型,是无具体类型的指针 void* 类型的指针变量,可以接收(存放)任意数据类型的地址 因为void*是无具体类型的指针,所以不可以进行+1/-1,解引用操作
qsort函数排序举例:
#include <stdio.h> #include <stdlib.h> void Print(int* arr, int sz) { int i = 0; for (i = 0; i < sz; i++) { printf("%d ", *(arr + i)); } printf("\n"); } int cmp_int(const void* e1, const void* e2) { return *(int*)e1 - *(int*)e2; //e1,e2是void*类型,而需要比较的元素是int型的整型数组, //所以需要强制类型转换成(int*),再解引用 } void test(int *arr,int sz) { qsort(arr, sz, sizeof(arr[0]),cmp_int); //cmp_int 是个函数指针,指向的函数可以比较两个函数。 } int main() { int arr[] = { 1,2,4,6,3,7,8,5,9,10 }; int sz = sizeof(arr) / sizeof(arr[0]); Print(arr, sz); test(arr,sz); Print(arr, sz); return 0; }