void 指针的背后藏着什么? void是什么意思( 二 )


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

void 指针的背后藏着什么? void是什么意思


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);最终运行的结果如下图所示:
void 指针的背后藏着什么? void是什么意思


通过函数指针,我们可以屏蔽各种具体处理方法的不同,也就是将不确定的因素都依赖于抽象,这也是面向抽象或面向接口编程的精髓 。
三、函数指针应用案例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);}

推荐阅读