C语言中的回调函数 和 函数指针

news2024/11/26 13:42:24

以冒泡排序为例:

void sort(int *a, int size)
{
    int i, j;
    for (i = 0; i < size-1; i++)
    {
        for (j = 0; j < size - i - 1; j++)
        {
            if (a[j] > a[j+1])
            {
                int num = a[j];
                a[j] = a[j+1];
                a[j+1] = num;
            }
            
        }
        
    }
    
}

int main(){

    int arr[9] = {1,2,3,4,5,6,7,8,9};

    sort(arr, 9); // sort
    for (int i = 0; i < 9; i++)
    {
        printf("%d ", arr[i]);
    }
    
    return 0;
}

结果

在这里插入图片描述
但冒泡排序只能实现从小到大排序,如果想实现从大到小排序,难道就要重写sort函数了吗

可以用函数指针 作为回调函数传入,避免修改函数的麻烦
定义以下函数

int greater(int a, int b)
{
    return a < b ? 1 : 0;
}

int less(int a, int b)
{
    return a > b ? 1 : 0;
}

void sort2(int *a, int size, int (*p)(int,int))
{
    int i, j;
    for (i = 0; i < size-1; i++)
    {
        for (j = 0; j < size - i - 1; j++)
        {
            if (p(a[j], a[j+1]))
            {
                int num = a[j];
                a[j] = a[j+1];
                a[j+1] = num;
            }
            
        }
        
    }
    
}

sort2中添加了函数指针 int (*p)(int,int), 且函数比较由

a[j] > a[j+1]

变为了

(p(a[j], a[j+1])

此时,main函数为

int main(){

    int arr[9] = {1,2,3,4,5,6,7,8,9};

    //sort(arr, 9); // sort
    sort2(arr, 9, greater);
    for (int i = 0; i < 9; i++)
    {
        printf("%d ", arr[i]);
    }
    printf("\r\n");

    sort2(arr, 9, less);

    for (int i = 0; i < 9; i++)
    {
        printf("%d ", arr[i]);
    }
    return 0;
}

结果:
在这里插入图片描述
没有修改sort函数 就实现了冒泡排序的逆序

一个看复杂指针的技巧:

例如

int *(*(*fp)(int))[10];

右左法则
先向右分析 再向左分析

找到变量名fp 向右看 是个右括号,向左看,是个*号,说明fp是个指针。再分析fp指向什么。

c 语言中,括号除了表示优先级,还可以作位函数调用运算符。所以fp是个指针,指向函数。函数需要分析参数和返回值类型。
fp右侧是个函数,函数的参数只有一个,类型为int。

(int)

再向左看 函数的返回值是

(*

是个指针

这个指针指向什么? 继续先向右看 指向了一个数组

[10]

再看左边 剩下了 int*
表示数组中每个元素都是整型指针

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/167737.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

列表元素的最大值,最小值,出现的次数和列表长度

1 获取列表中的最大元素和最小元素&#xff1a; 使用max和min可以分别获取一个列表中最大元素和最小元素的值&#xff0c;其语法格式为&#xff1a; max(list) 和min(list) 例&#xff1a;ls[12,34,56,87]#创建列表并赋给ls print(ls中最大元素值为&#xff1a;max(ls))#输出…

JDY-10M BLE组网模块介绍

JDY-10M BLE组网模块简介JDY-10透传模块是基于蓝牙4.0协议标准&#xff0c;工作频段为2.4GHZ范围&#xff0c;调制方式为GFSK&#xff0c;最大发射功率为8db&#xff0c;最大发射距离50米&#xff0c;具有功耗低、尺寸小、信号强、数据传输稳定等特性。JDY-10M BLE组网模块特征…

DM8:达梦数据库DEM部署说明(详细步骤)

DM8:达梦数据库DEM部署说明&#xff08;详细步骤&#xff09;1 创建一个数据库作为DEM后台数据库, 数据库dm.ini参数配置进行优化, 推荐配置:1.1 在该数据库中执行DEM的SQL脚本2 配置tomcat2.1 配置/tomcat/conf/server.xml2.2 修改jvm启动参数3 配置JAVA 1.8及以上版本的运行时…

潜力出众应该具有的特质

前言 先说一下背景&#xff0c;最近在以面试官的角色面试候选人的过程中&#xff0c;一直在思考一个问题&#xff1a;“如何判断一个候选人是否有潜力&#xff0c;是否适合这个岗位&#xff0c;入职后是否能能快速成长&#xff0c;成为独挡一面的人&#xff0c;一个有潜力的人…

手撕Pytorch源码#1.Dataset类 part1

写在前面手撕Pytorch源码系列目的&#xff1a;通过手撕源码复习了解高级python语法熟悉对pytorch框架的掌握在每一类完成源码分析后&#xff0c;会与常规深度学习训练脚本进行对照本系列预计先手撕python层源码&#xff0c;再进一步手撕c源码版本信息python&#xff1a;3.6.13p…

PHP MySQL 插入多条数据

使用 MySQLi 和 PDO 向 MySQL 插入多条数据 mysqli_multi_query() 函数可用来执行多条SQL语句。 以下实例向 "MyGuests" 表添加了三条新的记录: 实例 (MySQLi - 面向对象) <?php $servername "localhost"; $username "username"; $pas…

MWORKS 2023a 已上线!

同元软控不断打磨MWORKS产品&#xff0c;持续精进&#xff0c;于1月8日正式发布科学计算与系统建模仿真平台MWORKS 2023a。 欢迎大家前往同元软控官网下载MWORKS 2023a软件进行试用。我们在官网新增反馈问题入口&#xff0c;也欢迎大家提交工单以反馈产品建议。 1.MWORKS官方软…

FPGA:Vivado基于IP集成的计数器设计(3)

本节利用上一节创建和封装的ls61和ls00两个IP核。采用原理图设计的方式实现一个模9计数器&#xff0c;讲解IP核集成的Vivado设计流程。 &#xff08;1&#xff09;创建工程 创建一个名为count_bd的新工程&#xff0c;存于F:\FPGA\FPGAproject\exam文件夹下&#xff1b; &…

用 Goby 通过反序列化漏洞一键打入内存马【利用篇】

Goby 社区第 22 篇技术分享文章全文共&#xff1a;3734 字 预计阅读时间&#xff1a;10 分钟001 前言 在上一篇《Shell中的幽灵王者—JAVAWEB 内存马 【认知篇】》中&#xff0c;我从概念上介绍了很多内存马的东西&#xff0c;并给出了我的观点&#xff1a;“大势所趋下&#…

dvwa中的xss(跨站脚本)攻击

环境&#xff1a;dvwa: 192.168.11.135 dvwa版本&#xff1a; Version 1.9 (Release date: 2015-09-19)kail机器&#xff1a;192.168.11.156 一、XSS是什么XSS&#xff08;Cross Site Scripting&#xff0c;跨站脚本攻击&#xff09;&#xff0c;是指恶意攻击者往web页面里插入…

2003-2019年各省数据GDP、人均GDP、城镇化率、年末人口数、人口自然增长率

2003-2019年各省数据GDP、人均GDP、城镇化率、年末人口数、人口自然增长率 1、时间&#xff1a;2003-2019年 2、来源整理自统计NJ、各省NJ 3、指标包括&#xff1a;GDP、人均GDP、城镇化率、年末人口数、人口自然增长率 4、包括&#xff1a;31省 5、指标解释&#xff1a; …

2023届计算机专业弄潮儿如何快速找毕业论文文献?

人生苦短&#xff0c;我用Python 一、准备工作 软件选择 Python3.8pycharm 模块 requests #模拟请求 Selenium # 浏览器自动化操作winr打开搜索框&#xff0c;输入cmd按确定打开命令提示符窗口&#xff0c;输入pip install 加上你要安装的模块名&#xff0c; 回车即可安…

uml图 各连接线的含义

目录UML类图六种关系的总结1.泛化&#xff08;Generalization&#xff09;2.实现&#xff08;Realization&#xff09;3.关联&#xff08;Association&#xff09;4.聚合&#xff08;Aggregation&#xff09;5.组合&#xff08;Composition&#xff09;6.依赖&#xff08;Depen…

渗透学习-学习记录-利用浏览器的开发者工具实时修改网页前端JS代码(实现绕过)

文章目录前言一、JS前端的修改前言 最近学习了一些有关于JS脚本搭建网站方面的安全知识。通常来说JS是前端的页面代码&#xff0c;因此我们可以直接修改前端的JS代码来实现绕过&#xff0c;故我试着做了一下利用浏览器的开发者工具进行尝试修改页面&#xff0c;以此来直接进行…

<Python>使用python来控制windows系统音量

使用python可以对windows系统的音量进行读取或者设置。 平台&#xff1a;visual studio code 语言&#xff1a;python 需要的python模块&#xff1a; 1、pyqt5 2、ctypes&#xff1a; ctypes 是 Python 的外部函数库。它提供了与 C 兼容的数据类型&#xff0c;并允许调用 DLL …

中国芯,SNS521系列水燃行业云芯产品获奖

近日&#xff0c;由运营商财经网举办的2023中国财经TMT“领秀榜”盛典召开&#xff0c;天翼物联连获四个奖项&#xff0c;分别是&#xff1a;2022年度优秀物联网企业、2022年度5G最佳实践引领企业、2022年度运营商科技创新引领企业以及“SNS521系列水燃行业云芯产品”获2022年度…

命名空间!C++之路扬帆起航

&#x1f451;专栏内容&#xff1a;C学习笔记⛪个人主页&#xff1a;子夜的星的主页&#x1f495;座右铭&#xff1a;日拱一卒&#xff0c;功不唐捐 目录一、前言二、命名空间1、命名空间的定义Ⅰ、正常定义Ⅱ、嵌套定义Ⅲ、不连续定义2、命名空间的使用Ⅰ、域解析操作符Ⅱ、us…

工作流代码

工作流代码目录概述需求&#xff1a;设计思路实现思路分析1.at parata:2.cash20193.cashEntity4.cashFrmTemplate5.chartType:参考资料和推荐阅读Survive by day and develop by night. talk for import biz , show your perfect code,full busy&#xff0c;skip hardness,make…

分享85个PHP源码,总有一款适合您

PHP源码 分享85个PHP源码&#xff0c;总有一款适合您 下面是文件的名字&#xff0c;我放了一些图片&#xff0c;文章里不是所有的图主要是放不下...&#xff0c;大家下载后可以看到。 源码下载链接&#xff1a;https://pan.baidu.com/s/1606ndyliGtwnjU8vsCLGRg?pwdq0k2 提…

MyBatis -- 参数占位符 #{} 和 ${}

MyBatis -- 参数占位符 #{} 和 ${}一、准备工作二、参数占位符 #{} 和 ${}三、特殊场景3.1 特殊场景 1 -- String3.1.1 使用 #{}3.1.2 使用 ${}3.1.3 分析与解决3.2 特殊场景 2 -- MySQL 关键字3.3 特殊场景 3 -- SQL 注入问题 (重要)3.4 特殊场景 4 -- 模糊查询 like一、准备工…