void *func(void)与void (*func)(void)的理解

在这里插入图片描述

函数指针和指针函数
1.两个例子:
(1)void *func(void); 这是指针函数的一个例子。按照()的优先级高于*,所以这是一个函数,返回值为指针。
(2)void (*func)(void); 这是函数指针的一个例子。函数指针本身是一个指针,指向的是原型为void f(void)的函数。你只需要func=函数名,然后func().即可调用那个函数。

     
     
  1. #include <iostream>
  2. using namespace std;
  3. void f() {
  4. cout << "f()" << endl;
  5. }
  6. void g() {
  7. cout << "g()" << endl;
  8. }
  9. void h() {
  10. cout << "h()" << endl;
  11. }
  12. void (*my_func)();
  13. int main()
  14. {
  15. my_func = f;
  16. my_func();
  17. return 0;
  18. }
2.typedef void (*func)(void);这里把func作为函数指针的同义词。这个函数的原型为void f(void);

     
     
  1. #include <iostream>
  2. using namespace std;
  3. void f() {
  4. cout << "f()" << endl;
  5. }
  6. void g() {
  7. cout << "g()" << endl;
  8. }
  9. void h() {
  10. cout << "h()" << endl;
  11. }
  12. typedef void(*PF)();
  13. int main()
  14. {
  15. PF pf= f;
  16. pf();
  17. return 0;
  18. }
3.用函数指针作为函数的返回值。

     
     
  1. #include <iostream>
  2. using namespace std;
  3. void f() {
  4. cout << "f()" << endl;
  5. }
  6. void g() {
  7. cout << "g()" << endl;
  8. }
  9. void h() {
  10. cout << "h()" << endl;
  11. }
  12. void (*my_func)();
  13. //指定调用的函数
  14. void(* PF( void (*func)()))() {
  15. void(*old)() = my_func;
  16. my_func = func;
  17. return old;
  18. }
  19. int main()
  20. {
  21. my_func = f;
  22. PF(h)();
  23. my_func();
  24. return 0;
  25. }
分析:上面小程序的作用是为my_func指定要调用的函数。而void(*PF(void (*func)()))()即完成了这个任务。
对void(*PF(void (*func)()))();的理解可以展开:

     
     
  1. typedef void(*PF)();
  2. PF func(void(*p)()) {}
所以上面的 程序还可以这样写:

     
     
  1. #include <iostream>
  2. using namespace std;
  3. void f() {
  4. cout << "f()" << endl;
  5. }
  6. void g() {
  7. cout << "g()" << endl;
  8. }
  9. void h() {
  10. cout << "h()" << endl;
  11. }
  12. void (*my_func)();
  13. typedef void(*PF)();
  14. PF (func)( void(*p)()) {
  15. void(*old)() = my_func;
  16. my_func = p;
  17. return old;
  18. }
  19. int main()
  20. {
  21. my_func = f;
  22. func(h)();
  23. my_func();
  24. return 0;
  25. }
总结:函数指针确实比较难理解。但是好在函数指针的作用并不是很常用。函数指针通常用来指定要调用的函数。这也是我在看"STL源码剖析"的时候,才注意到了这种用法。
以上程序均在ubuntu+codeblocks环境下通过测试。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值