这里尝试写出了三种方法来定义函数指针,注意第三种直接可以得到指针变量(这里卡了我一下),对于函数指针,在当作参数来传递时,根据传入的函数名(函数地址即具体的函数执行入口)不同,会调用不同的函数,这点有点像c++多态虚函数重写,把函数指针和其他参数一起传入另一个函数,这里的性质有点类似于c++仿函数,而整个函数指针的存在又像是提供了某一类函数的框架,有点c++模板的感觉。这是我目前的一点感觉,虽然是几种不同的机制,但是现象上有一定的相似性。
函数指针.c
#include<stdio.h>
//函数指针
int myAdd(int num1, int num2)
{
printf("myAdd()\n");
return num1 + num2;
}
int mySub(int num1, int num2)
{
printf("mySub()\n");
return num1 - num2;
}
int myMutli(int num1, int num2)
{
printf("myMulti()\n");
return num1 * num2;
}
int myDiv(int num1,int num2)
{
printf("myDiv()\n");
return num1 / num2;
}
//第一种定义方法
typedef int (FUNCP1)(int, int);
//第二种定义方法
typedef int (*FUNCP2)(int, int);//注意定义成指针形式,*写在前面
int doFunc(FUNCP1 fp, int num1, int num2)
{
return fp(num1, num2);
}
void test01()
{
//函数名是一个函数的入口地址,也就是某一个函数的指针
FUNCP1* fp1 = myAdd;//FUNCP1被定义成了一种类型名的类型,所以此处加*写成指针类型,然后定义指针变量指向函数名
printf("第一种定义方法下的第一种使用方法: %d\n",fp1(10, 10));
printf("第一种定义方法下的第二种使用方法: %d\n",(*fp1)(10, 20));
printf("----------------------------------\n");
FUNCP2 fp2 = myAdd;//FUNCP2本身就定义成了指针类型,此处可以直接来定义一个指针变量,然后定义指针变量指向函数名
printf("第二种定义方法下的第一种使用方法: %d\n",fp2(30, 30));
printf("第二种定义方法下的第二种使用方法: %d\n",(*fp2)(30, 50));
printf("----------------------------------\n");
//第三种定义方法
int(*fp3)(int, int) = myAdd;//没有用到typedef,直接定义了一个指针变量,这里容易写错,容易搞成类型而非变量
printf("第二种定义方法下的第一种使用方法: %d\n",fp3(50, 50));
printf("第二种定义方法下的第二种使用方法: %d\n",(*fp3)(80, 50));
printf("----------------------------------\n");
system("pause");
return 0;
}
void test02()
{
//函数指针做参数可以实现类似多态的效果,有点模板的意思,将函数指针结合参数一起传递,又有点仿函数的意思
int ret = doFunc(myAdd, 10, 10);
printf("ret =%d\n", ret);
printf("------------------------\n");
ret = doFunc(mySub, 10, 10);
printf("ret =%d\n", ret);
printf("------------------------\n");
ret = doFunc(myMutli, 10, 10);
printf("ret =%d\n", ret);
printf("------------------------\n");
ret = doFunc(myDiv, 10, 10);
printf("ret =%d\n", ret);
printf("------------------------\n");
}
int main()
{
//test01();
test02();
system("pause");
return 0;
}
test01()测试结果:
test02()测试结果: