可爱的回调函数

news2024/11/25 4:45:27

 

目录

一、作者声明:

二、什么回调函数?

三、库函数qsort为例,讲解回调函数


一、作者声明:

标题中的可爱纯纯是用来凑字数,没有特殊含义,因为可爱的平台不让用四个字作为标题!

如果平台允许我甚至想用两个字作为标题——《回调》!或者直接一个字——《调》!

二、什么回调函数?

通过函数指针调用的函数就是回调函数。

如果把函数的指针(地址)作为参数传给另一个函数,当这个指针被用来调用其所指向的函数时,我们就说这是回调函数。回调函数不是由该函数的实现方直接调用,而是在特定的事件或条件发生时由另外一方调用的,用于对该事件或条件的响应。

三、库函数qsort为例,讲解回调函数

qsort函数:快速排序函数

qsort是一个库函数,底层使用的是快速排序的方式,对数据进行排序。该函数可以直接使用,能对任意类型的数据进行排序。

包含于头文件:

#include<stdlib.h>

函数原型:

void qsort (void* base, size_t num, size_t size, int (*compar)(const void* e1,const void* e2))

参数解析:

void *base是待排序数组第一个元素的地址(起始地址)

size_t num是待排序数组的大小(元素个数)

size_t num是待排序数组元素的大小(每一个元素的字节大小)

int (*compar)(const void* e1,const void* e2)是函数指针,指向比较函数(不同类型数据的比较方法不同,因此需要自定义比较方法),该函数返回值为int类型,参数为e1,e2,分别是待比较两个元素的地址。返回值要求:

若e1指向的元素大于e2指向的元素,则返回大于0的数字;若相等,则返回0;若小于,则返回小于0的数字。

(注1:正是因为有了compar比较函数,qsort函数才能排序任意类型的数据)

(注2:void *类型指针不能直接解引用,也不能加减整数,它是用来存放任意类型数据的地址,使用时需要强制类型转换)

实例代码1(排序整型数据):

void Printnums(int* nums, size_t size)//打印整型数组函数
{
	int i = 0;
	for (i = 0; i < size; i++)
	{
		printf("%d ", nums[i]);
	}
}

int cmp_int(const void* e1, const void* e2)//整形数据的比较函数
{
	return *(int*)e1 - *(int*)e2;//无具体类型指针先强制类型转换,再解引用
}
int main()
{
	int nums[10] = { 10,9,8,7,6,5,4,3,2,1 };
	qsort(nums, sizeof(nums) / sizeof(nums[0]), sizeof(nums[0]), cmp_int);
    //待排序数组起始地址;待排序数组元素个数;待排序数组每个元素的字节大小;数据比较函数

	Printnums(nums, sizeof(nums) / sizeof(nums[0]));
	return 0;
}

实例代码2(按年龄大小排序结构体数组):

struct stu {
	char name[20];
	int age;
};

void Print_struct_age(struct stu* arr,size_t size)//打印结构体数组中结构体成员变量—年龄
{
	for (int i = 0; i < size; i++)
	{
		printf("%d ", arr[i].age);
	}
	printf("\n");
}

int cmp_struct_age(const void* e1, const void* e2)//按照年龄比较排序
{
	return ((struct stu*)e1)->age - ((struct stu*)e2)->age;//强制类型转换为结构体指针类型,不解引用利用->也可以访问成员变量
}

int main()
{
	struct stu s1 = { "Tom",29 };//结构体变量
	struct stu s2 = { "Jerry",20 };
	struct stu s3 = { "David",26 };
	struct stu arr[] = { s1,s2,s3 };//结构体数组

	Print_struct_age(arr, sizeof(arr) / sizeof(arr[0]));//打印年龄
	qsort(arr, sizeof(arr) / sizeof(arr[0]), sizeof(arr[0]), cmp_struct_age);//按年龄排序
	Print_struct_age(arr, sizeof(arr) / sizeof(arr[0]));//打印年龄

	return 0;
}

 

实例代码3(按姓名首字母排序结构体数组):

struct stu {
	char name[20];
	int age;
};

void Print_struct_name(struct stu* arr,size_t size)//打印结构体数组中结构体成员变量—姓名
{
	for (int i = 0; i < size; i++)
	{
		printf("%s ", arr[i].name);
	}
	printf("\n");
}

int cmp_struct_name(const void* e1, const void* e2)
{
	return strcmp(((struct stu*)e1)->name, ((struct stu*)e2)->name);//利用strcmp字符串比较函数,该函数的返回值要求和qsort中compar比较函数的返回值要求相同
}

int main()
{
	struct stu s1 = { "Tom",29 };//结构体变量
	struct stu s2 = { "Siri",20 };
	struct stu s3 = { "David",26 };
	struct stu arr[] = { s1,s2,s3 };//结构体数组

	Print_struct_name(arr, sizeof(arr) / sizeof(arr[0]));//打印姓名
	qsort(arr, sizeof(arr) / sizeof(arr[0]), sizeof(arr[0]), cmp_struct_name);//按姓名首字母排序
	Print_struct_name(arr, sizeof(arr) / sizeof(arr[0]));//打印姓名

	return 0;
}

 

以上所有实例都是利用qsort快速排序函数对各种类型的数据排序,当我们向qsort函数参数传入比较函数compar地址时,该函数在qsort函数中通过其函数指针被调用,就是回调函数。

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

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

相关文章

上海未来产业创投联盟启动成立,和鲸Heywhale成为首批发起单位

第三届“海聚英才”全球创新创业峰会于近期举办&#xff0c;会上正式启动成立“上海未来产业创投联盟”&#xff0c;上海和今信息科技有限公司等 31 家单位成为首批发起单位。 为进一步坚定产业投资信心&#xff0c;营造最优人才生态&#xff0c;9月20日下午&#xff0c;第三届…

mstp vrrp bfd 实验

LSW1配置 <Huawei>sys Enter system view, return user view with CtrlZ. [Huawei]sys lsw1 [lsw1]vlan batch 10 20 30 [lsw1]int g0/0/1 [lsw1-GigabitEthernet0/0/1]port link-type access [lsw1-GigabitEthernet0/0/1]port default vlan 10 [lsw1-GigabitEthernet0…

ELK集群 日志中心集群

ES&#xff1a;用来日志存储 Logstash:用来日志的搜集&#xff0c;进行日志格式转换并且传送给别人&#xff08;转发&#xff09; Kibana:主要用于日志的展示和分析 kafka Filebeat:搜集文件数据 es-1 本地解析 vi /etc/hosts scp /etc/hosts es-2:/etc/hosts scp /etc…

铁路防护网RFID锁控,实现铁路防护网智能防盗防破坏

一、铁路防护网的挑战与需求 铁路防护网作为铁路运输系统中的重要组成部分&#xff0c;面临着安全性和防盗防破坏的挑战&#xff0c;传统的锁控系统存在以下问题&#xff1a; 1、安全隐患难以发现&#xff1a;传统锁控系统无法及时发现锁被剪断或破坏的情况&#xff0c;容易造…

【SpringCloud】Eureka原理分析、搭建Eureka服务、服务注册、服务发现

&#x1f40c;个人主页&#xff1a; &#x1f40c; 叶落闲庭 &#x1f4a8;我的专栏&#xff1a;&#x1f4a8; c语言 数据结构 javaEE 操作系统 Redis 石可破也&#xff0c;而不可夺坚&#xff1b;丹可磨也&#xff0c;而不可夺赤。 eureka 一、Eureka原理分析1.1 服务调用出现…

【项目开发 | C语言项目 | 贪吃蛇】

项目简单介绍 本项目是一个命令行版的贪吃蛇游戏。用户需要控制一个蛇在屏幕上移动&#xff0c;吃食物来增长&#xff0c;同时避免撞到边界和自己的身体。 一&#xff0c;开发环境需求 操作系统 &#xff1a;Windows 开发环境工具 &#xff1a;Qt, VSCode, Visual Studio 技…

springboot基于Web的社区医院管理服务系统springboot025

大家好✌&#xff01;我是CZ淡陌。一名专注以理论为基础实战为主的技术博主&#xff0c;将再这里为大家分享优质的实战项目&#xff0c;本人在Java毕业设计领域有多年的经验&#xff0c;陆续会更新更多优质的Java实战项目&#xff0c;希望你能有所收获&#xff0c;少走一些弯路…

10.8队列安排,最少找字典次数,表达式转换与计算模拟(栈、队列)

队列安排1160 灵活的插入与删除 用队列实现的话&#xff0c;就是双端队列&#xff0c; 第一阶段是要找到对应编号的同学&#xff0c;然后根据p的取值决定是怎么插入 第二阶段也是要找到对应编号同学&#xff0c;之后就删除&#xff0c;如果找不到就返回 思路是这个思路&…

前端JavaScript入门到精通,javascript核心进阶ES6语法、API、js高级等基础知识和实战 —— Web APIs(六)

思维导图 一、正则表达式 1.1正则表达式介绍 1.2 语法 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><meta name"viewpor…

JavaWeb-Vue

JavaScript-Vue 什么是Vue Vue Vue是一套前端框架&#xff0c;免除原生JavaScript中的DOM操作&#xff0c;简化书写。基于MVVM&#xff08;Model-View-ViewModel&#xff09;思想&#xff0c;实现数据的双向绑定&#xff0c;将编程的关注点放在数据上。官网&#xff1a;http…

若依项目新建子模块

官方资料:后台手册 | RuoYi 建设完成后测试详情 在新建的业务模块添加com.ruoyi.ding包&#xff0c;新建TestService.java&#xff1b; 在里面写测试代码返回hello 在ruoyi-admin新建测试类&#xff0c;调用helloTest&#xff0c;成功返回hello代表成功。

基于springboot实现汽车租赁管理系统项目演示【项目源码+论文说明】分享

基于springboot实现汽车租赁管理系统项目演示 摘要 随着社会的发展&#xff0c;计算机的优势和普及使得汽车租赁系统的开发成为必需。汽车租赁系统主要是借助计算机&#xff0c;通过对汽车租赁信息等信息进行管理。减少管理员的工作&#xff0c;同时也方便广大用户对个人所需汽…

(Vue3)defineOptions、defineModels Pinia及持久化

Vue3.3新特性defineOptions v-model和defineModel 开启特性vite.config.js中加配置 重启架子&#xff08;试验性质&#xff09;npm run dev Pinia Vue最新的状态管理工具&#xff0c;代替Vuex Pinia配置创建项目时自动添加 安装 npm install pinia 创建一个 pinia 实例 (根 s…

Unity简单操作:Unity接sdk写的java代码放在Plugins/Android/libs目录中即可被打进apk中,无需提前编译成jar

Unity项目&#xff0c;接入第三方sdk的时候&#xff0c;难免需要写一下java代码&#xff0c;之前的做法是把自己写的java先编译成一个game.jar&#xff0c;然后把game.jar放到Plugins/Android/libs目录中。 事实上&#xff0c;直接把java代码放在Plugins/Android/libs目录中即…

unity使用UniStorm 5.1.0.unitypackage增加天气

添加天天气组件unistorm 然后添加一个player 导入包会报错,需要修改代码 using UnityEngine; using UnityEngine.PostProcessing;namespace UnityEditor.PostProcessing {[CustomPropertyDrawer(typeof(UnityEngine.PostProcessing.MinAttribute))]sealed class MinDrawer : …

电商项目之如何扣减库存

文章目录 1 问题背景2 前言3 扣减库存的三种方案3.1 下单减库存3.2 付款减库存3.3 预扣库存 4 如何解决恶意买家下单的问题4.1 限制用户下单的数量4.2 标识恶意买家 5 实战&#xff1a;具体实现思路 1 问题背景 今天研究一下亿级流量的电商网站是怎么扣减库存 参考自&#xff1…

ml-dms-dataset实验

https://github.com/apple/ml-dms-dataset 数据集的两个问题&#xff1a; 部分图片失效images 和 labels不匹配 evaluation运行结果 论文中的结果&#xff1a; inference结果&#xff1a;

iPhone升级iOS17出现无法连接互联网的错误提示怎么办?

最新的iOS 17系统已经发布了快一个月了&#xff0c;很多人都已升级体验更多全新功能&#xff0c;但有部分用户却在升级过程中遇到一些问题&#xff1a;如无法验证更新&#xff0c;iOS17验证失败&#xff0c;因为您不再连接到互联网、 iPhone无法检查更新等错误问题。明明网络稳…

Java——String类的常见操作

Java String类的常见方法 package com.yushifu.javaAPI;import java.lang.reflect.Array; import java.util.Arrays; //String类的常见操作 public class Demo02 {public static void main(String[] args) {String s new String("ababbadc");//indexOf方法————…

RK3568驱动指南|第五期-中断-第48章 并发管理工作队列实验

瑞芯微RK3568芯片是一款定位中高端的通用型SOC&#xff0c;采用22nm制程工艺&#xff0c;搭载一颗四核Cortex-A55处理器和Mali G52 2EE 图形处理器。RK3568 支持4K 解码和 1080P 编码&#xff0c;支持SATA/PCIE/USB3.0 外围接口。RK3568内置独立NPU&#xff0c;可用于轻量级人工…