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

最终运行结果如下图所示 , 执行函数指针f1即执行了其所指向的具体的函数:

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

文章插图

2.2 函数指针的基本使用这里我们通过一个小案例来对函数指针做一个基本的使用介绍 。 相信大部分的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=http://www.naxs.cn/rizhi/%d/n",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;i0)        {            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);}(3)在main函数中针对int类型和结构体类型进行调用:
int main(int argc, char *argv[]){    // test1:int类型求最大值    int nums[] = { 3,5,8,7,6 };    int *pMax = (int *)getMax(nums,sizeof(int),sizeof(nums)/sizeof(int),        intDataCompare);    int max = *pMax;    printf("%d/n",max);    // test2:结构体类型求最大值    Dog dogs[] ={{"沙皮",3},{"腊肠",10},{"哈士奇",5},        {"京巴",8},{"大狗",2}};    Dog *pDog = (Dog *)getMax(dogs,sizeof(Dog),        sizeof(dogs)/sizeof(Dog),dogDataCompare);    printf("%s=%d",pDog->name,pDog->age);    return 0;}最终运行结果如下图所示:
void 指针的背后藏着什么? void是什么意思

推荐阅读