C语⾔回调函数详解
回调函数
在C语⾔编程中,我们经常听到回调函数(callback function)⼀说。对于C语⾔新⼿⽽⾔,回调函数可能是⼀个⽐较难于理解的东西。今天我将通过⼀个实际例⼦,来讲解什么是回调函数,为什么要⽤回调函数。
回调函数究竟有什么作⽤呢?
说到这⾥,就有了⽤户和开发者之间的概念,假设,⽤户是实现add_ret这个函数,⽽开发者是实现add这个函数,现在的需求是,⽤户将add_ret这个函数以参数的形式传⼊开发者实现的add函数,add函数就会返回⼀个数字给⽤户,开发者没必要告诉⽤户他实现了什么东西,⽤户也并不知道开发者是怎么实现的,⽤户只需要传⼊⾃⼰写的函数,便可以得到开发者实现的函数的返回值,开发者可以将内容封装起来,将头⽂件以及库⽂件提供给⽤户。
程序任务:
写⼀段程序,实现对⼀个整型数据的排序功能,可以递增排序,也可以递减排序。
上述任务的编程并不难,对于排序⽽⾔,我们⾄少会使⽤冒泡法。于是,我相信很多同学会写出这样的代码:
#include <stdio.h>
//升序排序
int sort_asc(int nums[], int cnt)
{
int i;
int j;
for (i = 0; i < cnt - 1; i++)
{
int m = i;
//查最⼩的数
for (j = i + 1; j < cnt; j++)
{
if (nums[j] < nums[m])
{
m = j;
}
}
c语言的冒泡排序算法//交换
if (m != i)
{
int t = nums[m];
nums[m] = nums[i];
nums[i] = t;
}
}
return 0;
}
//降序排序
int sort_dec(int nums[], int cnt)
{
int i;
int j;
for (i = 0; i < cnt - 1; i++)
{
int m = i;
//查最⼤的数
for (j = i + 1; j < cnt; j++)
{
if (nums[j] > nums[m])                            {
m = j;
}
}
//交换
if (m != i)
{
int t = nums[m];
nums[m] = nums[i];
nums[i] = t;
}
}
return 0;
}
void print_array(int num[], int cnt)
{
int i;
for (i = 0; i < cnt; i++)
{
printf("%d ", num[i]);
}
printf("\n");
}
int main(int argc, char *argv[])
{
int i;
int num[10] = {2, 3, 1, 3, 9, 12, 34, 8, 19, 0};
sort_asc(num, 10);
print_array(num, 10);
sort_dec(num, 10);
print_array(num, 10);
return 0;
}
在上⾯的例⼦中,我们实现了两个排序函数:sort_asc()与sort_dec(),分别⽤于升序与降序。不难发现,这两个函数⾮常相像,差别只在于⼀个判断符。这意味着我们写了冗余代码。⼗⼏年的编程⽣涯已经⽆数次⾮常清晰地告诉过我:冗余代码就负担,是垃圾。也许已经有⼈想到了消除冗余代码的⽅法:把两个函数合并成⼀个,函数后边加⼀个参数⽤于标识是升序还是降序,然后程序⾥有差异的地⽅⽤这个标识来⾛分⽀。⽼实说,这是⼀个⾮常不错的⽅法,但并不优雅,因为加上的分⽀条件会使们的程序变复杂。
那更好的⽅法是什么呢?答案是有很多,但是今天讲的是回调函数,那回调函数就要登场了。我们来看改进后的代码:
#include <stdio.h>
int sort(int nums[], int cnt, int (*cmp)(int, int))
{
int i;
int j;
for (i = 0; i < cnt - 1; i++)
{
int m = i;
//查最⼩的数
for (j = i + 1; j < cnt; j++)
{
if (cmp(nums[j], nums[m]) < 0)
{
m = j;
}
}
//交换
if (m != i)
{
int t = nums[m];
nums[m] = nums[i];
nums[i] = t;
}
}
return 0;
}
void print_array(int num[], int cnt)
{
int i;
for (i = 0; i < cnt; i++)
{
printf("%d ", num[i]);
}
printf("\n");
}
int num_cmp_asc(int a, int b)
{
return a - b;
}
int num_cmp_dec(int a, int b)
{
return b - a;
}
int main(int argc, char *argv[])
{
int i;
int num[10] = {2, 3, 1, 3, 9, 12, 34, 8, 19, 0};

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。