函数指针变量
一个数据变量的内存地址可以存储在相应的指针变量中,函数的首地址也可以存储在某个函数指针变量中.这样就可以通过函数指针变量来调用所指向的函数. 函数指针变量需要先声明再使用: void (*funPtr)(int);//声明一个指向 返回特定参数的函数指针变量. funPtr可以指向所有接收一个int作为输入,没有返回值的函数.
实例1
#include <stdio.h>
#include <stdlib.h>
void myFun(int);
int main()
{
myFun(100);
return 0;
}
void myFun(int x)
{
printf("myFun%d\n",x);
}
说明:声明函数myFun后直接调用.
实例2
#include <stdio.h>
#include <stdlib.h>
void (*funP)(int)
void (*funA)(int)
void myFun(int);
int main()
{
myFun(100);
funP = &myFun;//让funP指向myFun
(*funP)(200);//等价于 myFun(200)
funA = myFun;//funA指向myFun指向的地址
funA(300);//
funP(400);
(*funA)(6000);
(*myFun)(1000);
(**funA)(6000);
(***funA)(6000);
(****funA)(6000);
return 0;
}
void myFun(int x)
{
printf("myFun: %d\n",x);
}
输出
myFun: 100
myFun: 200
myFun: 300
myFun: 400
myFun: 600
myFun: 1000
总结:
- myFun和funP,funA一样,都是函数指针;myFun是常量,funP,funA是变量.
-
函数调用的本质是(*myFun)(100)这种形式,事实上对一个函数指针赋值给第二个函数指针,第二个函数指针会指向第一个函数指针指向的地方而不是第一个函数.
即funP=myFun 等价于 funP=&myFun.
- 声明函数时不能使用指针写法,声明函数指针时不能使用函数写法. 即void myFun(int )不能写成void (myFun)(int )。void (funP)(int )不能写成void funP(int )。
- 函数指针可以存入数组: int (*fArray[10])(int);
使用函数指针作为函数参数
#include <stdio.h>
#include <stdlib.h>
typedef void(*FunType)(int);
//前加一个typedef关键字,这样就定义一个名为FunType函数指针类型,而不是一个FunType变量。
//形式同 typedef int* PINT;
void myFun(int x);
void hisFun(int x);
void herFun(int x);
void callFun(FunType fp,int x);
int main()
{
callFun(myFun,100);//传入函数指针常量,作为回调函数
callFun(hisFun,200);
callFun(herFun,300);
return 0;
}
void callFun(FunType fp,int x)
{
fp(x);//通过fp的指针执行传递进来的函数,注意fp所指的函数有一个参数
}
void myFun(int x)
{
printf("myFun: %d\n",x);
}
void hisFun(int x)
{
printf("hisFun: %d\n",x);
}
void herFun(int x)
{
printf("herFun: %d\n",x);
}