全部学习汇总:GitHub - GreyZhang/c_basic: little bits of c.
前阵子似乎写了不少错代码,因为对函数指针的理解还不够。今天晚上似乎总算是梳理出了一点眉目,在先前自己写过的代码工程中做一下测试。
先前实现过一个归并排序算法,算法函数的一个传入参数是指向一个比较功能函数的指针。当时进行代码实现的时候这部分有点糊涂,写了一段糊涂代码居然最后运行出了结果。今天在这基础上进行更新、提升与总结。
对于需要实现的功能,首先我需要一个比较函数,而根据比较函数的原型我可以抽象化出一个数据类型如下:
typedef int CMP_PROC_t(const void*,const void*);
为了实现函数指针同时简化代码,增强代码的可读性,我需要构造另外一个数据抽象,定义另一个数据类型如下:
typedef CMP_PROC_t *CMP_PROC_pt;
这样,我就可以直接通过CMP_PROC_pt数据类型定义或者声明一个指向比较函数的指针。如果我已经定义了一个比较函数如下:
int CompareIntFunc(void *address1,void *address2)
{
int *address_var1 = NULL;
int *address_var2 = NULL;
int return_value = 0;
address_var1 = address1;
address_var2 = address2;
if(*address_var1 == *address_var2)
{
return_value = 0;
}
else
{
return_value = (*address_var1 > *address_var2) ? 1 : -1;
}
return return_value;
}
那么在使用归并排序函数之前,我可以先进行一个函数指针的定义,并且让此函数指针指向我需要的比较函数。假设需要排序的为整形数组,我可以定义函数指针如下:
int test_array[9] = {1,5,3,6,2,4,7,9,8}; //待排序数组
CMP_PROC_p_t p_CompareIntFunc = (CMP_PROC_p_t)&CompareIntFunc;
编写以下测试,实现相应功能的使用:
int main(void)
{
int i = 0;
mergesort(test_array,9,4,p_CompareIntFunc);
for(i = 0;i<9;i++)
{
printf("%d,",test_array[i]);
}
}
编译与运行结果如下:
这次比上次的代码清爽的多,而且编译一而没有任何警告灯扎眼的信息。
标签:int,void,address,1787,使用,函数指针,PROC,CMP From: https://blog.51cto.com/greyzhang/7588963