一江春水向东流

做一个有思想的人,期待与每一位热爱思考的人交流,您的关注是对我最大的支持。

  BlogJava :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理 ::
  44 随笔 :: 139 文章 :: 81 评论 :: 0 Trackbacks
 回调函数是一个程序员不能显式调用的函数;通过将回调函数的地址传给
调用者从而实现调用。回调函数使用是必要的,在我们想通过一个统一接口实现不
同的内容,这时用回掉函数非常合适。比如,我们为几个不同的设备分别写了不同
的显示函数:void TVshow(); void ComputerShow(); void NoteBookShow()...等
等。这是我们想用一个统一的显示函数,我们这时就可以用回掉函数了。void sho
w(void (*ptr)()); 使用时根据所传入的参数不同而调用不同的回调函数。
      不同的编程语言可能有不同的语法,下面举一个c语言中回调函数的例子,
其中一个回调函数不带参数,另一个回调函数带参数。
      例子1:
//Test.c
#include <stdlib.h>
#include <stdio.h>
int Test1()
{
  int i;
  for (i=0; i<30; i++)
  {
    printf("The %d th charactor is: %c\n", i, (char)('a' + i%26));

  }
  return 0;
}
int Test2(int num)
{
  int i;
  for (i=0; i<num; i++)
  {
   printf("The %d th charactor is: %c\n", i, (char)('a' + i%26));

  }
  return 0;
}
void Caller1(void (*ptr)())//指向函数的指针作函数参数
{
  (*ptr)();
}
void Caller2(int n, int (*ptr)())//指向函数的指针作函数参数,这里第一个参数是为指向函数的指针服务的,
{                                               //不能写成void Caller2(int (*ptr)(int n)),这样的定义语法错误。
  (*ptr)(n);
  return;
}
int main()
{
  printf("************************\n");
  Caller1(Test1); //相当于调用Test2();
  printf("&&&&&&************************\n");
  Caller2(30, Test2); //相当于调用Test2(30);
  return 0;
}
      以上通过将回调函数的地址传给调用者从而实现调用,但是需要注意的是带
参回调函数的用法。要实现回调,必须首先定义函数指针。函数指针的定义这里稍
微提一下。比如:
    int (*ptr)(); 这里ptr是一个函数指针,其中(*ptr)的括号不能省略,因为
括号的优先级高于星号,那样就成了一个返回类型为整型的函数声明了
posted on 2008-02-16 12:00 allic 阅读(18249) 评论(15)  编辑  收藏 所属分类: C/C++

评论

# re: 探讨C语言中的回调函数 2012-04-20 10:35 suiyuan0631
good  回复  更多评论
  

# re: 探讨C语言中的回调函数 2012-04-20 10:36 suiyuan0631
看了那么多个例子,就这个能让我看明白什么是回调函数了!非常感谢  回复  更多评论
  

# re: 探讨C语言中的回调函数 2012-07-10 15:36 Karl
同意楼上,这个最简单易懂。。窘  回复  更多评论
  

# re: 探讨C语言中的回调函数[未登录] 2013-01-07 17:05 adley
void Caller1(void (*ptr)())//指向函数的指针作函数参数
void (*ptr)() 里面应该是int型吧  回复  更多评论
  

# re: 探讨C语言中的回调函数 2013-03-19 21:40 fuyy
 Caller1(Test1); //相当于调用Test2();
这块是不是应该是Test1()啊?  回复  更多评论
  

# re: 探讨C语言中的回调函数 2013-05-09 14:40 游客
void Caller2(int n, int (*ptr)())
{
(*ptr)(n);
return;
}

调用ptr函数指针时候,传了实参n ,但定义的时候形参是空的。
应该是void Caller2(int n, int (*ptr)(int)) 这样吧  回复  更多评论
  

# re: 探讨C语言中的回调函数 2013-06-14 14:44 桃源伢子
没看见有回调的特点,就只是间接调用方法而已
通过调用Caller1(Test1);来间接调用Test1方法而已,只体现了函数指针的使用而已。
  回复  更多评论
  

# re: 探讨C语言中的回调函数 2013-08-05 16:51 kg
上面的代码中存在两处错误:
1.
void Caller1(void (*ptr)()); //此处被调用函数的返回值是void的类型的
int Test1(); //这个函数的返回值是int型的
Caller1(Test1); // 这里被调用函数的返回值却是int型的
//Caller1的声明应该改为:void Caller1(int (*ptr)());

2.
void Caller2(int n, int (*ptr)());//这里被调用函数是没有参数的
int Test2(int n); //这个函数的参数是int型的
Caller2(n, Test2); //这里调用了一个有参数的函数
//Caller2的声明应该改为:void Caller2(int, int (*ptr)(int));  回复  更多评论
  

# re: 探讨C语言中的回调函数 2013-10-26 10:41 无叶莲
@fuyy
恩恩 我觉得也是 应该是笔误了吧  回复  更多评论
  

# re: 探讨C语言中的回调函数 2013-12-12 18:11 多岁的
@suiyuan0631
但是运行不来啊  回复  更多评论
  

# re: 探讨C语言中的回调函数 2013-12-12 18:11 多岁的
运行不出来  回复  更多评论
  

# re: 探讨C语言中的回调函数[未登录] 2014-02-13 15:43 jack
完整的caller2的函数应该是:
void Caller2(int n , int (*ptr)(int))//指向函数的指针作函数参数,这里第一个参数是为指向函数的指针服务的
{ //不能写成void Caller2(int (*ptr)(int n)),这样的定义语法错误。
(*ptr)(n);
return;
}   回复  更多评论
  

# re: 探讨C语言中的回调函数[未登录] 2014-02-24 11:18 panpan
讲解比较清晰 尽管例子中有两处函数指针的错误,还是有可取之处  回复  更多评论
  

# re: 探讨C语言中的回调函数 2014-08-12 09:45 zl
我也觉得是这样@游客
  回复  更多评论
  

# re: 探讨C语言中的回调函数 2015-02-17 15:20 re
这个不是函数指针吗,怎么成了回调函数  回复  更多评论
  


只有注册用户登录后才能发表评论。


网站导航: