这里简单介绍函数指针的使用,结合几个小例子。
C语言函数指针是指向函数的指针,利用函数指针可以调用函数,也可以把函数当做参数传递。
函数指针变量的声明 跟函数的声明一致,要标明函数的指纹,即函数的参数和返回类型,声明之后函数指针变量只能指向指纹相同的函数(试了一下,并不会报错,但是应该不提倡执行指纹不同的函数吧)。声明的例子如下:
void (*funp)(int);
其中funp是一个变量名,指向这么一类函数:返回值为void,参数为一个int型。
变量的赋值 有两种方式:
void prototypeFun(int x){
printf("print in prototype function: %d\n",x);
}
funp = prototypeFun; //方式一
funp = &prototypeFun; //方式二
/*下面语句输出为4198420 4198420,也就是说prototypeFun和&prototypeFun值是
相同的,既然值是相同的,赋值fp=prototypeFun,fp=&prototypeFun也就是相同的,
这也说明函数名就是一个指针,指向函数的指针*/
printf("%d %d\n",prototypeFun,&prototypeFun);
函数指针作为函数参数,就是把函数指针传递给函数当做参数,在这之前可以先将指向特定函数指纹的函数指针定义为一种类型,当然也可以不定义,定义的方式为:
typedef void (*FunPtype)(int);
用typedef声明之后 FunPtype变为一种类型,以后就可以用这种类型声明变量了,如下:
FunPtype fp; //使用FunPtype类型定义一个变量
函数指针作为参数的例子如下:
void fun1(int x){
printf("print in fun1: %d\n",x);
}
void fun2(int x){
printf("print in fun2: %d\n",x);
}
void callFun(FunPtype fp,int x){ //使用函数指针类型
printf("a function call other function ");
fp(x);
}
void callFun2(void (*fun)(int),int x){ //不使用类型
fun(x);
}
callFun(fun1,40); //直接将函数名作为参数,函数名也是函数指针
callFun(fun2,50);
callFun2(fun1,60);
完整代码如下:
#include <stdio.h>
void prototypeFun(int); //原型函数的声明,一个函数的指纹是说函数的参数和返回类型
void (*funp)(int); //声明一个指针变量,声明指针变量是要说明指向的函数的指纹,即参数和返回类型
typedef void (*FunPtype)(int); //用typedef声明之后 funPtype变为一种类型,指向某种函数指纹的指针类型
FunPtype fp; //使用FunPtype类型定义一个变量
void callFun(FunPtype,int); //函数声明
void callFun2(void (*fun)(int),int x);
void fun1(int x){
printf("print in fun1: %d\n",x);
}
void fun2(int x){
printf("print in fun2: %d\n",x);
}
int main(){
prototypeFun(10);
(*prototypeFun)(15); //由此可以看出,函数名就是一个指针
funp = &prototypeFun;
funp(20);
printf("%d %d\n",prototypeFun,&prototypeFun);
fp = &prototypeFun; //效果与fp=prototypeFun一致
fp(30);
callFun(fun1,40); //直接将函数名作为参数
callFun(fun2,50);
callFun2(fun1,60);
return 0;
}
void prototypeFun(int x){
printf("print in prototype function: %d\n",x);
}