Chinaunix首页 | 论坛 | 博客
  • 博客访问: 393911
  • 博文数量: 85
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 1707
  • 用 户 组: 普通用户
  • 注册时间: 2013-08-27 11:18
个人简介

学无止境……

文章分类

全部博文(85)

分类: C/C++

2014-07-16 10:01:11

回调函数的概念网上很多,看着有点头疼,到现在还没看懂。概念不管了,先知道是用来干什么的再说。

(注:由于没有完全弄懂概念,很可能会有错误在其中,大家参考下就下行了,别太较真,不过欢迎大家指正,本意就是交流学习心得)

提到回调函数肯定会涉及函数指针,再牵扯到函数指针的“兄弟”----指针函数。先区分这两兄弟在谈,不然怕以后搞混啦。

函数指针,从汉字分词角度来说,说白了就是指针,函数这是修饰词,配角而已。只不它过指向的是函数的入口地址。

指针函数,跟他“兄弟”一样,“以貌取人”就行了,不就是个函数嘛,只是返回值是指针类型。

Void (*)fun(char param, ...)   // 函数指针

Void *fun(char param, ...)   // 指针函数

typedef void (*)fun(char param, ...)  //一般会把函数指针这样重定义,方便理解和使用
(函数中的“...”是省略的参数,并不是 变参函数 定义的 "...")


反正指针定义符“*被包围的就是函数指针,谁被重点保护谁当然是主角啦!

其实指针函数没什么好说的。这里主要说说是函数指针用在回调函数中。看代码(不看代码还学人家编程,伪程序员):

C语言的标准库函数中很多地方就采用了回调函数来让用户定制处理过程。如常用的快速排序函数、二分搜索函数等。代码来自http://www.cnblogs.com/swordzj/archive/2007/04/24/2034769.html

快速排序函数原型:

void qsort(void *base, size_t nelem, size_t width, int (_USERENTRY *fcmp)(const void *, const void *));

二分搜索函数原型:

void *bsearch(const void *key, const void *base, size_t nelem,

                 size_t width, int (_USERENTRY *fcmp)(const void *, const void *));

#include 

#include 

int sort_function( const void *a, const void *b);

int list[5] = { 54, 21, 11, 67, 22 };

int main(void)

{

   int  x;

   qsort((void *)list, 5, sizeof(list[0]), sort_function); // caller (Interface) 

   for (x = 0; x < 5; x++)

      printf("%i\n", list[x]);

   return 0;

}

int sort_function( const void *a, const void *b)  // callback function(Implementation)

{

   return *(int*)a-*(int*)b;

}

从上面的代码中总结:

1>回调函数不是由该函数的实现方直接调用,而是在特定的事件或条件发生时由另外的一方调用的,用于对该事件或条件进行响应。

2>你想让别人的代码执行你的代码,而别人的代码你又不能动,典型的就是一些库函数。

3>其实说的通俗点,看以把调用者看作类似java中的“接口”,对外提供标准,具体实现由回调函数来实现。

阅读(3129) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~