1787_函数指针的使用
  tSnhejlQLwoc 2023年11月02日 55 0


全部学习汇总: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]);
         }
}

编译与运行结果如下:

1787_函数指针的使用_数据类型

这次比上次的代码清爽的多,而且编译一而没有任何警告灯扎眼的信息。

【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 2023年11月08日 0

暂无评论

推荐阅读
  xaeiTka4h8LY   2024年04月26日   43   0   0 split数组字符串
tSnhejlQLwoc