定义一个函数指针类似:int (*ptr)(int a,int b);ptr只能指向同参数同返回值类型的函数名,相当于内存中函数代码块的首地址。
typedef可以实现简化目的,typedef int (*FP)(int a ,int b), FP ptr;相当于定义了这种类型的函数指针。
#include <stdio.h>
typedef int (*FP)(int,int);//可使用FP来定义函数指针
int add(int a,int b)
{
return a+b;
}
int sub(int a,int b)
{
return a-b;
}
int mul(int a,int b)
{
return a*b;
}
int div(int a,int b)
{
return a/b;
}
void test(int (**fp)(int,int),int c)//可以修改*fp指向的函数地址,跟指针用法一样;将函数指针作为参数传入,即为平时所用的callback
{
int a = 6,b=3;
printf("value is %d \n",c+(*fp)(a,b));
*fp = div;
}
FP calc_trans(int ops)//根据操作符返回函数指针
{
switch(ops)
{
case '+':return add;
case '-':return sub;
case '*':return mul;
case '/':return div;
default:
break;
}
return NULL;
}
void main()
{
FP fptr[] = {add,sub,mul,div,NULL};
int a = 4;
int b = 2;
int i = 0;
while(fptr[i] != NULL)
{
printf("ret is %d\n",fptr[i](a,b));//fptr[](a,b)该方式为函数指针特有
i++;
}
test(&fptr[2],5);
printf("new value %d\n",fptr[2](a,b));
FP ops = calc_trans('+');
printf("add %d\n",ops(a,b));
}