回调函数
来源:互联网 发布:万方数据库医学网 编辑:程序博客网 时间:2024/05/01 20:39
话说这是我的第一篇技术博客....................好吧,废话还是不多说,进入正题:
回调函数,也是反反复复反反复复琢磨了好久,感觉还是没有深刻理解到,现在写出来,和大家一起讨论..........
简单一点说,如果函数的参数是一个函数指针,调用者通过调用该函数向它传入一个函数的地址,让该函数去实现它,这就称为回调函数。如:函数A有一个参数为函数指针类型,那么我们就可以传入一个函数的地址给A,A就会去执行这个函数。不懂?呵呵,我们举个例子:
例如我有一个API函数A,张三需要我的A函数为他调用B来实现某个功能,那么我就可以在程序A中写道:
A()
{
......
B();
......
}
过了几天,李四想用我的A函数来调用C来实现某个功能,那么我就得把A的程序改一下,变成
A()
{
......
C();
......
}
又过了几天,王五也想用我的A函数来调用D来实现某个功能,这下我就烦了,整天改来改去多麻烦啊,有没有好的方法让我提供一个统一的API呢?这里就体现出回调函数的好处来了!
下面是我利用回调函数的特性来写的一个泛型函数,该函数的功能是在任意一组对象中求出其最大值,该对象可以是char型,也可以是int型......不多说了,直接看程序吧:
#include <stdio.h> typedef int (*cmp_t) (void*, void*);typedef struct student{ char* name; int score;}student_t; int cmp_char_data(void* a, void* b){ char para1 = *((char*)a);char para2 = *((char*)b); if(para1 > para2) {return 1;}else if(para1 == para2){return 0; } else{return -1;} } int cmp_int_data(void* a, void* b){ int para1 = *((int*)a);int para2 = *((int*)b);if(para1 > para2) {return 1;}else if(para1 == para2){return 0;}else{return -1;}}int cmp_double_data(void* a, void* b){ double para1 = *((double*)a);double para2 = *((double*)b);if(para1 > para2) {return 1;}else {return -1;} }int cmp_struct_data(void* a, void* b){ student_t* para1 = (student_t*)a;student_t* para2 = (student_t*)b;if(para1->score > para2->score) {return 1; }else if(para1->score == para2->score) {return 0;}else{return -1;} }void* max(void* data, int num, int size, cmp_t cmp){void *temp = data;int i; for(i = 1; i < num; i++) { if(cmp(temp, data + size*i) < 0) { temp = data+size*i;} } return temp;}int main(){ char c_data[5] = {'a', 'n', 'k', 'p', 'c'};int i_data[5]={1, 20, 50, 300,12};double d_data[5] = {20.2, 130.5, 100.12, 200.23, 45.6};student_t st_data[5] = {{"stu1", 56}, {"stu1", 85}, {"stu1", 65}, {"stu1", 96}, {"stu1", 72}}; char max1 = *((char*)max(c_data, 5, sizeof(char), cmp_char_data));int max2 = *((int*)max(i_data, 5, sizeof(int), cmp_int_data)); double max3 = *((double*)max(d_data, 5, sizeof(double), cmp_double_data)); student_t* max4 = (student_t*)max(st_data, 5, sizeof(student_t), cmp_struct_data); printf("%c\t%d\t%lf\t%d\n", max1, max2, max3, max4->score); getchar(); return 0;}
欢迎大家指正,无论是格式,逻辑.....什么都好,共同进步!
- .NET 回调函数
- 回调函数
- 回调函数
- 回调函数概念
- 回调函数
- 回调函数
- 回调函数
- 回调函数 相关
- delphi 回调函数
- 回调函数
- 回调函数
- 回调函数学习
- 回调函数
- 关于回调函数
- 透析回调函数
- 回调函数
- 什么是回调函数
- 回调函数
- 不错的toast特效总结
- JavaMail:用Authenticator的子类进行身份验证及策略模式(Strategy)
- [转]JavaScript日期选择器
- java应用程序中嵌入浏览器总结
- 百度11月4日网上笔试题及答案
- 回调函数
- 这些App决定你是被解雇还是录用
- Linux分区空间不足了怎么办??
- J2EE领域的一些技术框架结构图
- 线程中CreateEvent和SetEvent及WaitForSingleObject的用法
- Spring--quartz中cronExpression配置说明
- UVA 439
- 求去空格的sql语句
- ※设计模式※→☆创建型模式☆============Simple Factory模式(二)