首页 > 其他分享 >1787_函数指针的使用

1787_函数指针的使用

时间:2023-09-24 22:05:09浏览次数:39  
标签:int void address 1787 使用 函数指针 PROC CMP


全部学习汇总: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_函数指针的使用_数组

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

标签:int,void,address,1787,使用,函数指针,PROC,CMP
From: https://blog.51cto.com/greyzhang/7588963

相关文章

  • ansible教程:使用win_shell和win_copy从 HTTP 文件服务器下载文件并将其复制到目标位置
    with_fileglob参数无法直接指定HTTP文件服务器上的文件路径。它是用于在本地文件系统中进行文件的模式匹配,并将匹配的文件作为迭代项来执行任务。如果你需要从HTTP文件服务器上下载文件并将其复制到目标位置,你可以使用适当的工具或库来实现这个任务。下面是一个示例,使用curl......
  • R语言使用Metropolis-Hastings采样算法自适应贝叶斯估计与可视化|附代码数据
    原文链接:http://tecdat.cn/?p=19889原文出处:拓端数据部落公众号 最近我们被客户要求撰写关于Metropolis-Hastings采样的研究报告,包括一些图形和统计输出。如果您可以写出模型的似然函数,则 Metropolis-Hastings算法可以负责其余部分(即MCMC)。我写了r代码来简化对任意模型的后......
  • Angular 应用开发中 Injection Token 的使用方法介绍
    Angular是一个流行的前端JavaScript框架,它提供了一种强大的方式来构建单页应用程序(SPA)。在Angular中,依赖注入(DependencyInjection,DI)是一项关键的功能,它允许我们有效地管理应用程序中的依赖关系。Angular的依赖注入系统使用InjectionToken来实现某些特殊的依赖注入需求。在本文中,......
  • Llama2-Chinese项目:2.3-预训练使用QA还是Text数据集?
      Llama2-Chinese项目给出pretrain的data为QA数据格式,可能会有疑问pretrain不应该是Text数据格式吗?而在Chinese-LLaMA-Alpaca-2和open-llama2预训练使用的LoRA技术,给出pretrain的data为Text数据格式。所以推测应该pretrain时QA和Text数据格式都应该支持。然后马上就会有一个疑问......
  • 无法在web.xml或使用此应用程序部署的jar文件中解析绝对uri:[http://java.sun.com/jsp/
    今天解决了一个很早之前的问题!!!无法在web.xml或使用此应用程序部署的jar文件中解析绝对uri:[http://java.sun.com/jsp/jstl/core]之前一直以为是jar包不匹配,但是改了jar包之后连uri都分辨不出来了后来在网上查到是tomcat的问题,将tomcat的conf目录下的catalina.properties的tomc......
  • JavaScript函数的使用
    有关函数概念:匿名函数指的是没有函数名称的函数。作用:可以有效的避免全局变量的污染以及函数名的冲突问题。说明:既是函数表达式的另一种表示形式,又可通过函数声明的方式实现调用。函数语法varfun4=function(){console.log("我是匿名函数中封装的一段代码");......
  • LangChain使用fine-tuned GPT-3.5
    LangChain使用fine-tunedGPT-3.5参考:https://openai.com/blog/gpt-3-5-turbo-fine-tuning-and-api-updateshttps://platform.openai.com/docs/guides/fine-tuninghttps://qiita.com/MandoNarin/items/6fadb78f357c66e25502事前准备!pipinstallopenai!pipinstalltiktok......
  • golang 怎么使用接口中声明的方法
    假设你有一个golang的interface,里面声明了1个函数,怎么调用这个函数typeManinterface{ Eat(ctxcontext.Context,foodstring})error}使用方式创建结构体实现这个接口声明的方法,然后创建该结构体对象,调用方法案例首先,我们需要创建一个实现了这个接口的结构体:type......
  • 使用Consul搭建负载均衡
    一、Consul服务注册发现1.启动Consul:consulagent-dev 2.打开Consul地址,默认8500端口:8500 3.封装静态类,注册Consul服务的方法:usingConsul;usingMicrosoft.Extensions.Configuration;usingSystem;publicstaticclassC......
  • 使用Nginx搭建负载均衡
    1.修改配置文件conf/nginx.conf      2.配置文件中增加服务调用upstreamNET6RC2{server127.0.0.1:5726;server127.0.0.1:5727;server127.0.0.1:5728;server127.0.0.1:5729;}server{......