函数指针的用途:
l 调用函数
l 做函数的参数
声明方法:
数据类型标识符 (指针变量名)(形参列表)
“()”的优先级高于”*”,故指针变量名外的括号必要的情况不可少,但不同的编译器也有不同的要求,再本文CodeBlock编译器下加括号反而报错,
不过可以根据这个思路去查找错误
下面是一个比较详细的例子源代码:
#include<stdio.h>
//声明一个函数指针
void *fun(int a,int b){
printf("Result of fun : %d \r\n",a+b);
}
//不带指针typedef
typedef int MyFun(int,int);
//一个不带指针typedef实例
int funWithoutPointer(int a,int b){
printf("Result function without Pointer test %d \r\n",a+b);
}
//fun1中声明一个函数指针的形参
int fun1(void (*funTest)(int,int),int b){
funTest(b,b); //此处在fun1域内的函数调用名即为fun
printf("Result of fun1: %d\r\n",b);
return 0;
}
//typedef声明一个函数格式
typedef int *FunPram(int a,int b);
//fun3实现一个与typedef格式相同的函数
int fun3(int a,int b)
{
return a>b?a:b;
}
//max函数中声明的FunPram声明直接作为函数参数进行传递
void max(FunPram a,int b,int c){
printf("Max result: %d \r\n", a(b,c));
}
/************返回函数指针******************/
//typedef声明一个函数格式
typedef int *FunCall();
//声明满足函数指针声明的四个函数FunCall1——FunCall4
int FunCall1()
{
return 1;
}
int FunCall2()
{
return 2;
}
int FunCall3()
{
return 3;
}
int FunCall4()
{
return 4;
}
//实现一个函数指针函数其返回值为FunCall函数指针
FunCall *call_func(int a){
switch(a){
case 1: return FunCall1;
case 2: return FunCall2;
case 3: return FunCall3;
case 4: return FunCall4;
default: return NULL;
}
return NULL;
}
//定义一个返回函数指针的函数指针宏
typedef FunCall *Call_FunCall(int a);
//将返回值为FunCall函数指针的宏作为参数传入getFunCall
void getFunCall(Call_FunCall a){
int i=1;
for(i=1;i<=4;i++)
printf("FunCall%d result : %d \r\n",i,a(i)());//a(i)()二级调用返回int值
}
//主函数
int main(){
//变量声明
int m=0;
void (*p)(); //声明p为函数指针
void *pointer; //void指针
/*********函数指针数组声明**********/
int (*FunVector[4])();
/*********函数指针数组的指针声明**********/
int (*(*FunVectorPointer)[4])();
//不带指针typedef变量声明
MyFun *myfunction;
p = fun; //对函数指针p的赋值
p(5,3); //对函数指针p的调用
int (*q)(); //声明一个名称为q的函数指针
q = fun1; //另q指针指向fun1
q(p,10); //运行q函数并传入函数指针p
fun1(p,5); //直接调用fun1运行
//函数实体fun3传入函数max的形参当中,在其中调用函数实体fun3
max(fun3,15,7);
//不带指针typedef变量赋值
myfunction = funWithoutPointer;
//不带指针typedef函数调用
myfunction(100,200);
getFunCall(call_func);
//返回主函数
/*********函数指针数组**********/
FunVector[0]=FunCall1; //赋值
FunVector[1]=FunCall2;
FunVector[2]=FunCall3;
FunVector[3]=FunCall4;
for(m=0;m<4;m++)
printf("Function Pointer Vector FunVector[%d]'s result %d: \r\n",m+1,(FunVector[m])());
//函数指针数组的指针
FunVectorPointer = &FunVector;
for(m=0;m<4;m++)
printf("Function Pointer Vector's Pointer FunVector[%d]'s result %d: \r\n",m+1,(FunVectorPointer[0][m])());
/*****对(void*)指针的操作,打印void指针的大小*****/
printf("Size of (void *) %d \r\n",sizeof(pointer));
printf("Size of (void) %d \r\n",sizeof(*pointer));
return 0;
}