加载中…
个人资料
self
self
  • 博客等级:
  • 博客积分:0
  • 博客访问:3,953
  • 关注人气:6
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

C语言Struct中的函数和函数指针

(2012-12-12 16:56:31)
标签:

杂谈


比如下面这段代码:

  1. #include <stdio.h>  
  2.   
  3. struct FuncInside  
  4.  
  5.     int mA;  
  6.     void func()  
  7.      
  8.         printf("Hello, function inside!\n");  
  9.      
  10. };  
  11.   
  12.   
  13. void main(void 
  14.  
  15.     struct FuncInside f;  
  16.   
  17.     f.mA 99;  
  18.     f.func();  
  19.   
  20.     getchar();  
  21.  


编译会提示:

[plain] view plaincopy
  1. 1>e:\learn\vs\struct\struct\funcpointer.c(7) error C2032: “func”: 函数不能是 struct“FuncInside” 的成员  

那么这个问题应该如何解决呢?

一刹那,一句话在脑海中闪现,“指针是C语言的精华。”

啊哈,灵机一动!

虽然Struct中不能有函数体,但是我们可以在Struct中使用函数指针来实现同样的目的。


先来讲一讲什么叫 函数指针?

函数指针,注意要区别于指针函数,声明格式如下:

函数类型 (标志符 指针变量名) (形参列表);


象某一数据变量的内存地址可以存储在相应的指针变量中一样,函数的首地址也以存储在某个函数指针变量里的。
这样,我们就可以通过这个函数指针变量来调用所指向的函数了。

举个例子来说明吧:

 int (*pfun)(int, int);

通过括号强行将pfun首先与“*”结合,也就意味着,pfun是一个指针,接着与后面的“()”结合,说明该指针指向的是一个函数,然后再与前面的int结合,也就是说,该函数的返回值是int。由此可见,pfun是一个指向返回值为int的函数的指针。


注意要区别于指针函数

 int *pfun(int, int);

你注意到它们之间的区别了吗?


我们修改下之前的代码:

  1. #include <stdio.h>  
  2.   
  3. struct FuncInside  
  4.  
  5.     int mA;  
  6.     void (*pFunc)();  
  7. };  
  8.   
  9. void Foo()  
  10.  
  11.     printf("Hello, Function Inside Struct!\n");  
  12.  
  13.   
  14.   
  15. void main(void 
  16.  
  17.     struct FuncInside f;  
  18.   
  19.     f.mA 99;  
  20.     f.pFunc Foo;  
  21.   
  22.     f.pFunc();  
  23.   
  24.     getchar();  
  25.  

编译顺利通过,输出也是我们期望的结果。



之前int (*pFun)(int, int),其中pFun是一个函数指针。而事实上,为了代码的移植考虑,一般使用typedef定义函数指针类型:

typedef int (*pFun)(int, int);


当使用typedef声明后,则pFun就成为了一个函数指针“类型”,即一种函数回调类型。这其实是一种回调函数的实现方法。


一个简单的例子如下:

[cpp] 

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有