指向函数的指针
1.一个函数在编译时被分配一个入口地址。这个函数的入口地址就称为函数的指针。可以用一个指针变量指向函数,然后通过该指针变量调用此函数。
例如:比较2个数字,返回大的数字:
void main() {
int swap(int a,int b);
int a,b,max;
a= 5;
b= 4;
int(*p)(int,int); /*用来定义p是一个指针函数的指针变量,该函数有两个整形参数,返回值为整形,括号不可省略。*/
p= swap; /*将函数的入口地址赋值给指针变量p,函数名代表该函数的地址*/
max = (*p)(a,b); /*以指针形式调用函数*/
printf("%d\n",max);
}
int swap(int a,int b) {
int tem;
tem= a > b ? a : b;
return tem;
}
说明:
a)指向函数的指针变量的定义形式为:
返回类型(*指针变量名)(参数列表);
b)在一个程序中,一个指针变量可以先后指向同类型的不同函数。
c)在给指针函数赋值的时候只需要函数名。
d)函数指针++,--运算无意义。
2.函数指针变量通常的用途之一是把指针作为参数传递到其他函数中。
简述如下:有一个函数sub,它有两个参数x1,x2。定义x1和x2为指向函数的指针变量。在调用函数sub时,实参为两个函数f1和f2,给形参传递的是f1和f2的地址。这样在函数中就可以调用f1和f2函数了。
实参函数名 f1 f2
void sub(int (* x1) (int),int (* x2) (int int)) {
int a,b,i,j;
a= (*x1)(i);
b= (*x2)(i,j);
}
应用场景:如果每次在调用sub函数时,要调用的函数不是固定的,这次调用f1和f2,而下次要调用f3和f4。这时只要在每次调用sub函数时给出不同的函数名作为实参即可,sub函数不必做任何修改。这种方法符合结构化程序设计方法原则,在程序设计中经常使用。
例如:设计一个函数,输入a和b,第一次调用输出大的数,第二次调用输出小的数,第三次调用输出两个数的和。
void main() {
int max(int,int);
int min(int,int);
int add(int,int);
int process(int,int,int (*p)(int,int));
int a,b,tem;
a= 5;
b= 8;
tem= process(a,b,max);
printf("maxis %d \n",tem);
tem= process(a,b,min);
printf("minis %d \n",tem);
tem= process(a,b,add);
printf("addis %d \n",tem);
}
int max(int a,int b) {
int tem;
tem= a > b ? a : b;
return tem;
}
int min(int a,int b) {
int tem;
tem= a > b ? b : a;
return tem;
}
int add(int a,int b) {
int tem;
tem= a + b;
return tem;
}
int process(int a,int b,int (*p)(int,int)) {
int tem;
tem= (*p)(a,b);
return tem;
}
输出:
maxis 8
minis 5
addis 13
文章链接:http://blog.csdn.net/murongshusheng/article/details/8690697