1787_函数指针的使用

2023-09-19 18:37:30

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

         }

}

编译与运行结果如下:

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

更多推荐

Mysql 数据库基础介绍

Mysql数据库基础介绍一、数据库介绍1.1、数据库的发展史1.1.1、文件管理系统的缺点1.1.2、数据库系统发展阶段1.3、DBMS数据库管理系统1.4、数据库管理系统的优点1.5、数据库管理系统的基本功能1.6、数据库系统的架构1.7、各种数据库管理系统1.7.1、层次数据库1.7.2、网状数据库1.7.3、RD

TCP/IP协议栈各层涉及到的协议

21/tcpFTP文件传输协议22/tcpSSH安全登录、文件传送(SCP)和端口重定向23/tcpTelnet远程连接80/tcpHTTP443/tcpHTTPS计算机各层网络协议五层:应用层:(典型设备:应用程序,如FTP,SMTP,HTTP)DHCP(DynamicHostConfigurationProtoco

动态规划问题

看一遍就理解:动态规划详解-什么样的问题可以考虑使用动态规划解决呢?如果一个问题,可以把所有可能的答案穷举出来,并且穷举出来后,发现存在重叠子问题,就可以考虑使用动态规划。比如一些求最值的场景,如最长递增子序列、最小编辑距离、背包问题、凑零钱问题等等,都是动态规划的经典应用场景。-动态规划的解题思路动态规划的核心思想就

面试:C++ 11 智能指针

查询内存泄露方法啥是内存泄露内存泄露在维基百科中的解释如下:在计算机科学中,内存泄漏指由于疏忽或错误造成程序未能释放已经不再使用的内存。内存泄漏并非指内存在物理上的消失,而是应用程序分配某段内存后,由于设计错误,导致在释放该段内存之前就失去了对该段内存的控制,从而造成了内存的浪费。在C++中出现内存泄露的主要原因就是程

若依注解学习(一)@Log

@Log涉及到:Log,LogAspect,SecurityUtils,SysUser,SysOperLog,BusinessStatus,StringUtils,ServletUtilsAsyncManager,AsyncFactory,AddressUtils,IpUtils,RuoYiConfig,HttpUti

3D模型转换工具HOOPS Exchange如何实现OBJ格式轻量化?

什么是OBJ模型轻量化?OBJ格式是一种常用的三维模型文件格式,通常包含模型的顶点、法线、纹理坐标等信息,但有时候这些信息可能会使模型文件变得较大,不利于网络传输、加载和运行。OBJ(Object)模型轻量化是指对OBJ格式的三维模型数据进行优化和压缩,以减少模型文件的大小和内存占用,同时尽量保持模型的视觉质量和几何信

浙工大MBA常规批复试建议怎么准备?

&nbsp;&nbsp;&nbsp;&nbsp;如果你第一志愿报考浙江工业大学MBA项目不想被无故的淘汰,小编建议你还是认真对待考后的复试环节。因为从2023年的招生录取可以看到,浙工大MBA项目的提前批面试对于最终录取几乎是没什么作用的,在与普通考生同层次竞争的局面下,复试谁发挥的好,分数高,谁就可以获得录取的资格。

接口自动化测试:pytest基础讲解

为什么要做接⼝测试?只靠前端测试很难确保很⾼的覆盖率。接⼝测试,可以模拟出各种类型的⼊参,包括⼀些在前端模拟不出来的⼊参,还能根据接⼝⽂档的定义,设计出相对完善的⼊参值,在接⼝层保证质量,剩余的绝⼤多数问题就是应⽤程序⾃⾝的交互和数据展⽰问题。接⼝测试相对于交互界⾯测试和功能测试来说,更容易实现⾃动化,执⾏起来⽐较稳定

数据分析的-五种常用方法实例

一、对照俗称对比,单独看一个数据是不会有感觉的,必需跟另一个数据做对比才会有感觉。比如下面的图a和图b。图a毫无感觉图b经过跟昨天的成交量对比,就会发现,今天跟昨天实则差了一大截。这是最基本的思路,也是最重要的思路。在现实中的应用非常广,比如选产品丶监控增量等,这些过程就是在做【对照】,决策BOSS们拿到数据后,如果数

websocket php教程

WebSocket是HTML5提供的一种网络通讯协议,用于服务端与客户端实时数据传输。广泛用于浏览器与服务器的实时通讯,APP与服务器的实时通讯等场景。相比传统HTTP协议请求响应式通讯,WebSocket协议可以做到实时的双向通讯,服务端可以在任何时候向客户端推送数据(HTTP协议需要客户端发起请求后才能推送)。PH

Spring高手之路14——深入浅出:SPI机制在JDK与Spring Boot中的应用

文章目录1.SPI解读:什么是SPI?2.SPI在JDK中的应用示例3.SPI在Spring框架中的应用3.1传统Spring框架中的SPI思想3.2SpringBoot中的SPI思想4.SPI在JDBC驱动加载中的应用5.如何通过SpringBoot自动配置理解SPI思想6.SPI(ServiceProviderIn

热文推荐