例一:函数指针使用
#include <stdio.h>
int printf_1(int a)
{
printf("this is printf_1\n");
printf("a = %d\n",a);
}
int main()
{
int (*f)(int); //定义函数指针
f = printf_1; //函数指针指向printf_1函数,注意这里不执行函数,只是指向函数
f(2); //向函数指针传入参数,并执行
}
例二:函数指针作为参数
#include <stdio.h>
#include <stdlib.h>
int myAdd(int a,int b)
{
int c = a + b;
printf("myAdd:%d\n",c);
return c;
}
int myAdd2(int a, int b)
{
int c = a + b;
printf("myAdd2:%d\n", c);
return c;
}
//定义了一个类型
typedef int (*MyTypeFunAdd)(int a, int b);
//函数指针做函数参数
int Test(MyTypeFunAdd fun)
{
int c = fun(5,6);
return c;
}
//另一种写法
int Test2(int (*MyTypeFunAdd2)(int a, int b))
{
int c = MyTypeFunAdd2(7, 8);
return c;
}
void main()
{
myAdd(1,2);
MyTypeFunAdd my = myAdd;
my(9,10);
//实现了任务的调用和任务的编写分开
Test(my);
Test(myAdd);
Test(myAdd2);
//就算以后增加myAdd3、myAdd4或更多,整体框架也无需更改,直接添加即可
//Test函数相当于供应商提供的函数,myAdd相当于调用者提供的函数,所以此处被调用者反过来调
//用了调用者的函数,即回调函数
system("pause");
}
例三:用函数指针实现简单计算器
#include <stdio.h>
typedef int (*CLAC)(int,int); //定义函数指针类型(与要赋值的函数形式一致)
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; }
CALC calc_func(char op) //根据op类型返回对应函数
{
switch(op)
{
case '+':
return add;
case '-':
return sub;
case '*':
return mul;
case '/':
return div;
default:
return NULL;
}
return NULL;
}
int calc(int a, int b, char op)
{
CLAC fp = calc_func(op); //fp指向返回的函数,注意这里只是指向返回的函数,并不执行返回的 函数
if(fp) return fp(a,b); //执行fp指向的函数
else return -1;
}
int main()
{
int a,b;
printf("please input:\n");
printf("a = ");scanf("%d", &a);
printf("b = ");scanf("%d", &b);
printf("****************************");
printf("a + b = %d\n",calc(a, b, '+'));
printf("a - b = %d\n",calc(a, b, '-'));
printf("a * b = %d\n",calc(a, b, '*'));
printf("a / b = %d\n",calc(a, b, '/'));
printf("****************************");
return 0;
}