我们可以在main函数中使用这个函数指针来指向一个具体的函数(这个具体的函数定义需要和函数指针的定义一致):
void test1(int age){ printf(test1:%dn,age);}int main(void){ // 声明一个intFunc类型的函数指针 intFunc f1 = test1; // 执行f1函数指针所指向的代码区 f1(8); return 0;}最终运行结果如下图所示,执行函数指针f1即执行了其所指向的具体的函数:

2.2 函数指针的基本使用【void 指针的背后藏着什么? void是什么意思】这里我们通过一个小案例来对函数指针做一个基本的使用介绍 。相信大部分的C#或Java程序员都很熟悉foreach,那么我们就来模拟foreach对int数组中的值进行不同的处理 。具体体现为for循环的代码是复用的,但是怎么处理这些数据不确定,因此把处理数据的逻辑由函数指针指定 。
void foreachNums(int *nums,int len,intFunc func){ int i; for(i=0;i<len;i++) { int num = nums[i]; func(num); }}void printNum(int num){ printf(value=https://www.mduoduo.com/baikezatan/%dn,num);}在foreachNums函数中,我们定义了一个intFunc函数指针,printNum函数是满足intFunc定义的一个具体的函数 。
下面我们在main函数中将printNum函数作为函数指针传递给foreachNums函数 。
int nums[] = { 1,5,666,23423,223 }; foreachNums(nums,sizeof(nums)/sizeof(int),printNum);最终运行的结果如下图所示:

通过函数指针,我们可以屏蔽各种具体处理方法的不同,也就是将不确定的因素都依赖于抽象,这也是面向抽象或面向接口编程的精髓 。
三、函数指针应用案例3.1 计算任意类型的最大值(1)定义函数指针及getMax主体:
typedef int (*compareFunc)(void *data1,void *data2);// getMax 函数参数说明:// data 待比较数据数组的首地址,uniteSize单元字节个数// length:数据的长度 。{1,3,5,6}:length=4// 比较data1和data2指向的数据做比较,// 如果data1>data2,则返回正数void *getMax(void *data,int unitSize,int length,compareFunc func){ int i; char *ptr = (char*)data; char *max = ptr; for(i=1;i<length;i++) { char *item = ptr+i*unitSize; //到底取几个字节进行比较是func内部的事情 if(func(item,max)>0) { max = item; } } return max;}这里可以看到,在getMax中到底取几个字节去比较都是由compareFunc所指向的函数去做,getMax根本不用关心 。
(2)定义符合函数指针定义的不同类型的函数:
int intDataCompare(void *data1,void *data2){ int *ptr1 = (int*)data1; int *ptr2 = (int*)data2; int i1=*ptr1; int i2=*ptr2; return i1-i2;}typedef struct _Dog{ char *name; int age;} Dog;int dogDataCompare(void *data1,void *data2){ Dog *dog1 = (Dog*)data1; Dog *dog2 = (Dog*)data2; return (dog1->age)-(dog2->age);}
推荐阅读
- 平菇上面长了白色的绒绒还能吃吗
- 这个送男友的本命年礼物真绝! 本命年礼品
- 寺庙里挤满了烧香拜佛的人 烧香图片
- 电烤箱烤香肠的温度和时间
- 你该知道的关税税率适用原则 进口关税税率查询
- 砂糖橘的白丝可以吃吗
- 腊肉长白色的霉怎么处理
- 天然蜂蜜的保质期是多久
- 砂糖橘是热性还是凉性的食物
- 在深圳的三个服装批发市场 深圳童装批发
