一、什么是回调函数❓❓
回调函数:通过函数指针调用的函数,就是将一个函数的指针(地址)作为参数,当函数指针调用其所指向的函数时,这就叫回调函数。
注意:回调函数不是由该函数的实现方直接调用,而是在特定条件下,由另外一方进行调用,用于对该条件的相应。
二、回调函数应用演示 ❗❗
在我们用C语言且没有实现回调函数时,实现一个简易计算器通常是这样的:
#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; } int Mul(int x, int y) { return x * y; } int Div(int x, int y) { return x / y; } void menu() { printf("***************************\n"); printf("***** 1.add 2. sub ****\n"); printf("***** 3.mul 4. div ****\n"); printf("***** 0.exit ****\n"); printf("***************************\n"); } int main() { int input = 0; int x = 0; int y = 0; int ret = 0; do { menu(); printf("请选择:>"); scanf("%d", &input); switch (input) { case 1: printf("请输入2个操作数:>"); scanf("%d %d", &x, &y); ret = Add(x, y); printf("%d\n", ret); break; case 2: printf("请输入2个操作数:>"); scanf("%d %d", &x, &y); ret = Sub(x, y); printf("%d\n", ret); break; case 3: printf("请输入2个操作数:>"); scanf("%d %d", &x, &y); ret = Mul(x, y); printf("%d\n", ret); break; case 4: printf("请输入2个操作数:>"); scanf("%d %d", &x, &y); ret = Div(x, y); printf("%d\n", ret); break; case 0: printf("退出计算器\n"); break; default: printf("选择错误\n"); break; } } while (input); }
这样写代码虽然是可以正常运行的,但是代码显得十分冗余,有许多的重复的代码:
在这种情况下,我们就可以利用回调函数来巧妙地解决这个问题:
#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; } int Mul(int x, int y) { return x * y; } int Div(int x, int y) { return x / y; } void Cal(int (*p)(int, int)) { int x = 0; int y = 0; int ret = 0; printf("请输入2个操作数:>"); scanf("%d %d", &x, &y); ret = p(x, y); printf("%d\n", ret); } void menu() { printf("***************************\n"); printf("***** 1.add 2. sub ****\n"); printf("***** 3.mul 4. div ****\n"); printf("***** 0.exit ****\n"); printf("***************************\n"); } int main() { int input = 0; do { menu(); printf("请选择:>"); scanf("%d", &input); switch (input) { case 1: Cal(Add); break; case 2: Cal(Sub); break; case 3: Cal(Mul); break; case 4: Cal(Div); break; case 0: printf("退出计算器\n"); break; default: printf("选择错误\n"); break; } } while (input); }
回调函数还有一个重要应用,就是在我们C语言的库函数提供的qsort(快速排序)中:
- base——待排序数组的首地址
- num——待排序数组的长度
- size——待排序数组中每个元素的大小
- compar——指向比较两个元素的函数的指针
在qsort函数中就使用了回调函数,就是调用了compar这个函数:
对qsort进行应用演示:
#include<stdio.h> #include<string.h> #include<stdlib.h> int compar(const void* e1, const void* e2) { return strcmp((char*)e1,(char*)e2); } void print(char arr[][10], int sz) { int i = 0; for (i = 0; i < sz; i++) { printf("%s ", arr[i]); } printf("\n"); } int main() { char str_arr1[][10] = { "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday" }; int size = sizeof(str_arr1) / sizeof(str_arr1[0]); qsort(str_arr1, size, sizeof(str_arr1[0]), compar); print(str_arr1, size); return 0; }
运行结果为: