LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 1207|回复: 7

可以这样定义函数指针吗?

[复制链接]
发表于 2006-4-7 20:53:50 | 显示全部楼层 |阅读模式

  1. void Function(void*, void**)
  2. {
  3.         ...
  4. }
  5. Function* CallbackP;
  6. void Demo(void*,void**);


  7. int main(void)
  8. {
  9.      ...
  10.      Callbackp = Demo;
  11.      ...
  12. }
复制代码

我只用过这样定义的:

  1. void (*FunPointer)(void*, void**);
  2. void Demo(void*,void**);

  3. int main(void)
  4. {
  5.     ...
  6.    FunPointer =  Demo;
  7.    ...
  8. }
复制代码
发表于 2006-4-7 21:19:18 | 显示全部楼层
不可以吧。
第一短程序中Function只是函数名又不是类型。

可以
typedef void (*Function)(void*, void**);

然后就可以Function myfunc; myfunc=Demo;
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-4-8 22:54:03 | 显示全部楼层
不可以是指我所定义的吗?还是我上面所定义的。我所定义的应该没错。而上面的却没见过,不过Lolita所讲的:

  1. typedef void (*Function)(void*, void**)
复制代码

好像见过。请指教
回复 支持 反对

使用道具 举报

发表于 2006-4-8 23:07:18 | 显示全部楼层
void (*FunPointer)(void*, void**);
FunPointer=Demo;

这样自然可以。FunPointer 是一个函数指针变量。

而typedef void (*Function)(void*, void**); 是引入了一个类型助记符Function,利用这个Function 就可以声明很多很多的函数指针变量。 你可以看看typedef 相关东西。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-4-17 10:02:52 | 显示全部楼层

  1. #include <stdio.h>

  2. typedef void (*funPointer)(void);

  3. typedef struct {
  4.         funPointer Left;
  5.         funPointer Right;
  6. }key_Handler;

  7. key_Handler Handler;

  8. void DemoHandler(funPointer);
  9. void Left(void);
  10. void Right(void);

  11. int main(void)
  12. {
  13.     Handler.Left = Left;  //或&Left,结果都一样的
  14.     DemoHandler(Handler.Left);

  15.     Handler.Right = Right;  //或&Right,结果都一样的
  16.     DemoHandler(Handler.Right);

  17.     exit(0);
  18. }

  19. void DemoHandler(funPointer fP)
  20. {
  21.      fP();
  22. }
  23. void Left(void)
  24. {
  25.      fprintf(stdout, "%s\n", "<-");
  26. }
  27. void Right(void)
  28. {
  29.      fprintf(stdout, "%s\n", "->");
  30. }
  31. "callback.c" 39L, 544C written                                
  32. [root@root GUI]# gcc callback.c
  33. [root@root GUI]# ./a.out
  34. <-
  35. ->
  36. [root@root GUI]#
复制代码

为什么用&与不用&都一样呢? 又试过signal(XXXX, funCallback)/signal(XXXX,&funCallback)中的funCallback用于不用&也一样。不解,请指教!
谢谢!
回复 支持 反对

使用道具 举报

发表于 2006-4-17 12:34:33 | 显示全部楼层
函数变量就是函数的入口地址, 所以用与不用是一样的

建议看K&R的书。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-4-17 15:04:33 | 显示全部楼层
K&R的书。? 看来大家都推崇这本书,有PDF版本吗? 广州这边哪里有? 华师大西门有吗?
回复 支持 反对

使用道具 举报

发表于 2006-4-17 16:30:30 | 显示全部楼层
网上有英文版,广州购书中心有中文版和答案书。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表