本帖最后由 豌豆爹 于 2024-2-21 10:56 编辑
3.函数指针应用案例
3.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);
}
(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;
}
最终运行结果如下图所示:
3.2 C中自带的qsort函数—自定义排序
qsort包含在<stdlib.h>头文件中,此函数根据你给的比较条件进行快速排序,通过指针移动实现排序。排序之后的结果仍然放在原数组中。使用qsort函数必须自己写一个比较函数。我们可以看看qsort函数的原型:
void qsort ( void * base, size_t num, size_t size, int ( * comparator ) ( const void *, const void * ) );
int nums[] = { 3,5,8,7,6 };
qsort(nums,sizeof(nums)/sizeof(int),sizeof(int),intDataCompare);
int i;
for(i=0;i<sizeof(nums)/sizeof(int);i++)
{
printf("%d ",nums);
}
printf("\n");
Dog dogs[] ={{"沙皮",3},{"腊肠",10},{"哈士奇",5},
{"京巴",8},{"大狗",2}};
qsort(dogs,sizeof(dogs)/sizeof(Dog),sizeof(Dog),dogDataCompare);
for(i=0;i<sizeof(dogs)/sizeof(Dog);i++)
{
printf("%s %d ",dogs.name,dogs.age);
}
那么,快速排序后是否有结果呢?答案是肯定的,我们可以传入各种比较方法,可以升序排序也可以降序排序。
|