L,wang

坚持改革,开放人性的弱点……
函数指针的使用

1.声明一个函数指针:
int (*fun)(int,char,long,....);
fun即表示一个指向返回值为int,参数为(int, char,long,.....)的函数的指针变量。
若有函数定义如下:

int f1(int,char,long,.....)
{
doSomething;
return 0;
}

则可这样使用:
fun=f1;
fun(3,'a',3.000,......);//即相当于对f1函数的调用

注意初学者易犯的几个错误:
int (*fun)(int,char,long,....) funp; //照搬 int i;思维定势式错误
int (*)(int,char,long,....) fun; //同样是错误的思维方式导致

2.typedef 在函数指针中的应用

typedef int (*FUNP)(int,char,long,.....);

FUNP fun; //即相当于 int (*fun)(int,char,long,.....) 指针函数声明

3.Two Exapmle:
example1.c

1 #include <stdio.h>
2 int inc(int a)
3 {
4 return (++a);
5 }
6 int multi(int *a, int *b, int *c)
7 {
8 return (*c=*a**b);
9 }
10
11 void show(int(*fun)(int*,int*,int*),int arg1,int *arg2)
12 {
13 int(*p)(int in)=inc;
14 int temp=p(arg1);
15 fun(&temp,&arg1,arg2);
16 printf("%d\n",*arg2);
17 }
18
19 int main(void)
20 {
21 int a;
22 show(multi,10,&a);
23 return 0;
24 }

example2.c
1 #include <stdio.h>
2 int inc(int a)
3 {
4 return (++a);
5 }
6 int multi(int *a, int *b, int *c)
7 {
8 return (*c=*a**b);
9 }
10
11 typedef int (FUNP1)(int);
12 typedef int (FUNP2)(int*,int*,int*);
13 void show(FUNP2 *fun,int arg1,int *arg2) //void show(FUNP2 fun,int arg1,int *arg2) 也能编译通过且无错!
14 {
15 FUNP1 *p=inc; //FUNP1 *p=&inc; 也通过,结果无错!
16 int temp=p(arg1);
17 fun(&temp,&arg1,arg2);
18 printf("%d\n",*arg2);
19 }
20
21 int main(void)
22 {
23 int a;
24 show(multi,10,&a); //show(&multi,10,&a) 也编译通过且结果无错
25 return 0;
26 }

/////////////以上两个例子在gcc 版本 4.4.6 20120305 (Red Hat 4.4.6-4) (GCC)下均能编译通过且无警告,结果相同////////////////////////////////

posted on 2013-04-21 13:33  L,wang  阅读(139)  评论(0编辑  收藏  举报