为什么要用函数指针?

分类: C/C++

“函数指针”是指向函数的指针变量,因而“函数指针”本身首先应是指针变量,只不过该指针变量指向函数。这正如用指针变 量可指向整型变量、字符型、数组一样,这里是指向函数。C在编译时,每一个函数都有一个入口地址,该入口地址就是函数指针所指向的地址。有了指向函数的指 针变量后,可用该指针变量调用函数,就如同用指针变量可引用其他类型变量一样,在这些概念上一致的。
数据类型标志符 (*指针变量名)(参数);注:函数括号中的参数可有可无,视情况而定。 

C语言Codee#10843
01  #include
02  int  max( int  x , int  y ){  return( x > y ? x : y);  }
03  void  main()
04  {
05      int ( * ptr)();
06      int  a ,b , c;
07      ptr = max;
08      scanf( "%d,%d" , & a , &b);
09      c =( * ptr)( a ,b);
10      printf( "a=%d,b=%d,max=%d" , a ,b , c);
11  }


关于函数指针更深入的解释见:
http://blog.pfan.cn/whyhappy/6030.html
http://www.chinaunix.net/jh/23/993238.html

函数指针的作用?
1.函数指针主要是能够用一个指针的方式指向一个函数,并且还可以换换指向别的函数,比如有多个函数的申明,它们有不同的具体实现,如果需要调用它们,就可以用一个指针轮流指向它们。
C语言Codee#10844
01  //自行包含头文件
02  void  MyFun1( int  x); 
03  void  MyFun2( int  x); 
04  void  MyFun3( int  x); 
05  typedef  void ( * FunType)( int );  //②. 定义一个函数指针类型FunType,与①函数类型一至
06  void  CallMyFun( FunType  fp , int  x);
07 
08  int  main( int  argc ,  char *  argv [])
09  {
10     CallMyFun( MyFun1 , 10);    //⑤. 通过CallMyFun函数分别调用三个不同的函数
11     CallMyFun( MyFun2 , 20);  
12     CallMyFun( MyFun3 , 30);  
13  }
14  void  CallMyFun( FunType  fp , int  x//③. 参数fp的类型是FunType。
15  {
16    fp( x); //④. 通过fp的指针执行传递进来的函数,注意fp所指的函数是有一个参数的
17  }
18  void  MyFun1( int  x// ①. 这是个有一个参数的函数,以下两个函数也相同
19  {
20     printf( “函数 MyFun1 中输出: % d \n , x);
21  }
22  void  MyFun2( int  x
23  {
24     printf( “函数 MyFun2 中输出: % d \n , x);
25  }
26  void  MyFun3( int  x
27  {
28     printf( “函数 MyFun3 中输出: % d \n , x);
29  }


2.回调机制就是很好的应用函数指针的例子,这是函数指针作为回调函数的一个参数。
比如你要让windows系统知道在某种事件(如:鼠标按下)发生后该如何响应(或根本不响应),但系统怎么知道你的程序里有这么一个函数是用来响应鼠标 按下的呢?所以在这个函数前面加一个CALLBACK并把此函数地址赋给系统,windows就知道调用哪个函数来响应哪个事件。
具体可以看看关于回调函数的解释。

3.在嵌入式中操作函数指针十分方便,如:
1  /* 定义一个无参数、无返回类型的函数指针类型  */
2  typedef   void  ( * lpFunction) ( );    
3  /* 定义一个函数指针,指向CPU启动后所执行第一条指令的位置 */
4  lpFunction  lpReset  =( lpFunction) 0xF000FFF0;    
5  /* 调用函数 */
6  lpReset();

lpReset()
,它实际上起到了“软重启”的作用,跳转到CPU启动后第一条要执行的指令的位置。
http://hi.baidu.com/gilbertjuly/blog/item/c22e11cd2a1f021c00e928ac.html
  • 5
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值