前言:本篇文章是我对回调函数的一个简单的理解,用两个应用:计算器实现和用冒泡的方式实现qsort函数来解释什么是回调函数。
回调函数是什么
回调函数就是一个通过函数指针调用的函数。如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用来调用其所指向的函数时,我们就说这是回调函数。回调函数不是由该函数的实现方直接调用,而是在特定的事件或条件发生时由另外的一方调用的,用于对该事件或条件进行响应。
我的简单理解:假设现在有两个函数一个a函数,一个b函数,我们将a函数的地址存在一个函数指针里边,传给b函数,然后b函数通过一些条件对这个函数指针进行使用来调用它所指向的函数,既(a函数),那么就称为a函数为回调函数。
使用回调函数实现一个简单的计算器
#include<stdio.h>
#include<windows.h>
int Add(int x, int y)
{
return x + y;
}
int Mul(int x, int y)
{
return x * y;
}
int Sub(int x, int y)
{
return x - y;
}
int Div(int x, int y)
{
return x / y;
}
void menu()
{
printf("******************************\n");
printf("****** 1.Add 2.Mul *******\n");
printf("****** 3.Sub 4.Div *******\n");
printf("****** 0.Exit ********\n");
printf("******************************\n");
}
void calc(int (*pcalc)(int ,int))//用一个函数指针接收arr[input]
{
int x = 0;
int y = 0;
int ret = 0;
printf("请输入两个操作数:");
scanf_s("%d%d", &x, &y);
ret = pcalc(x, y);
//calc函数通过函数指针调用Add,Mul,Div,Sub函数,这里就可以认为Add,Mul,Div,Sub是回调函数
//calc这个函数可以计算各种运算,好像变得很通用
printf("ret=%d\n", ret);
}
int main()
{
int input = 0;
int(*arr[5])(int, int) = { 0, Add, Mul, Sub, Div };
//arr为一个函数指针数组,这里多放一个0是为了下标的输入相匹配
do
{
menu();
printf("请选择计算类型:");
scanf("%d", &input);
if (input >= 1 && input <= 4)
{
calc(arr[input]);
//arr[input]就是访问下标为input的函数指针数组的值,拿到的是一个函数指针
}
else if (input != 0)
{
printf("输入有误\n");
}
else
;
} while (input);
system("pause");
return 0;
}
使用回调函数和冒泡方式实现qsort函数
#include<stdio.h>
#include<string.h>
#include<windows.h>
int int_cmp(const void*p1, const void*p2)
{
return (*(int*)p1) - (*(int*)p2);
}
//比较函数
void swap(char *e1, char *e2, int width)
{
while (width--)
{
char temp = *e1;
*e1 = *e2;
*e2 = temp;
e1++;
e2++;
}
}
void bubble_sort(void *base, int sz, int width, int(*cmp)(const void *e1, const void *e2))
//用函数指针接收
{
int i = 0;
for (i = 0; i < sz-1; i++)
{
int j = 0;
for (j = 0; j < sz - 1 - i; j++)
{
if (cmp((char *)base + j*width, (char *)base + (j + 1)*width))
//通过函数指针调用函数int_cmp
{
swap((char *)base + j*width, (char *)base + (j + 1)*width ,width);
}
}
}
}
int main()
{
int i = 0;
int arr[] = { 1, 2, 4, 6, 8, 3, 0 };
int sz = sizeof(arr) / sizeof(arr[0]);
bubble_sort(arr, sz, sizeof(int), int_cmp);
//传参int_cmp为函数的地址,是一个函数指针
for (i = 0; i < sz; i++)
{
printf("%d ", arr[i]);
}
printf("\n");
system("pause");
return 0;
}