C中函数指针的作用

来源:互联网 发布:学英语发音软件 编辑:程序博客网 时间:2024/05/17 07:38
项目中用到了很多封装在struct中的函数指针,以前在MFC里面经常用到则个作为回调函数,还以为是微软设计的特色呢。在网上查了一下它的用法,做个总结。
 
1)提供调用的灵活性。设计好了一个函数框架,但是设计初期并不知道自己的函数会被如何使用。比如C的”stdlib”中声明的qsort函数,用来对数值进行排序。显然,顺序还是降序,元素谁大谁小这些问题,库程序员在编写qsort的时候不可能决定。这些问题是要在用户调用这个函数的时候才能够决定。那边qsort如何保证通用性和灵活性呢?采用的办法是让函数的使用者来制定排序规则。于是调用者应该自己设计comparator函数,传给qsort函数。这就在程序设计初期保证了灵活性。尽管使用函数指针使得程序有些难懂,但是这样的牺牲还是值得的。
 
2)提供封装性能。有点面向对象编程的特点。比如设计一个栈结构

typedef struct _c_stack{
               int base_size;
               int point;
               int * base;
               int size;
               int  (*pop)(struct _c_stack *);
               int  (*push)(int,struct _c_stack *);
               int  (*get_top)(struct _c_stack);
}c_stack;

在初始化完之后,用户调用这个结构体上的pop函数,只需要s.pop(&s)即可。即使这个时候,工程内部有另外一个函数名字也叫pop,他们之间是不会发生名字上的冲突的。

原因很简单,因为结构体中的函数指针指向的函数名字可能是

int ugly_stupid_no_one_will_use_this_name_pop(c_stack *)
,只是stack的用户是不知道他在调用s.pop(&s),实际上起作用的是这样一个有着冗长名字的函数。

 函数指针这种避免命名冲突上的额外好处对于一些库函数的编写者是很有意义的,因为库可能被很多的用户在许多不同的环境下使用,这样就能有效的避免冲突而保证库的可用性

函数指针是指向函数的指针变量。 因而“函数指针”本身首先应是指针变量,只不过该指针变量指向函数。这正如用指针变量可指向整型变量、字符型、数组一样,这里是指向函数。如前所述,C在编译时,每一个函数都有一个入口地址,该入口地址就是函数指针所指向的地址。有了指向函数的指针变量后,可用该指针变量调用函数,就如同用指针变量可引用其他类型变量一样,在这些概念上是一致的。函数指针有两个用途:调用函数和做函数的参数。

例如:
[cpp] view plaincopy
  1. #include <stdio.h>  
  2. int max(int x,int y)  
  3. {  
  4.     return x>y?x:y;  
  5. }  
  6. int min(int x,int y)  
  7. {  
  8.     return x<y?x:y;  
  9. }  
  10. int main(int argc, char* argv[])  
  11. {  
  12.     int (* ptr[2])(int,int);  
  13.     int a,b;  
  14.     ptr[0]=max;  
  15.     ptr[1]=min;  
  16.     scanf("%d %d",&a,&b);  
  17.     printf("%d/n",ptr[0](a,b));  
  18.     printf("%d/n",ptr[1](a,b));  


0 0
原创粉丝点击