回调函数及其应用案例
回调函数及其应用案例
- 前言
- 一、qsort函数的应用
- 二、使用回调函数模拟qsort(排序方法采用冒泡)
- 三、总结
前言
回调函数的定义:通过一个函数指针调用的函数。我们把将函数的指针(地址)作为参数传递给另一个函数,当这个指针被用来调用其所指向的函数的过程,称为回调函数。回调函数不是由该函数的实现方直接调用,而是在特定的事件或条件发生时由另外一方的调用的,用于对该事件或条件进行响应。
一、qsort函数的应用
qsort函数可以排序任意数据类型的数组,我们先看看函数的参数是什么:
可以看到,函数的参数有四个,分别是
①需要排序的数组,用void来接收
②数组的元素个数
③每个元素的字节大小
④ int (__cdecl *compare )(const void *elem1, const void *elem2 ) );类型的函数指针
使用演示(示例学生信息按名字排序):
代码:
#include<stdio.h>
#include<string.h>
struct stu {char name[10];int age;double score;
};
int cmp_name(void*e1,void*e2)
{return strcmp(((struct stu*)e1)->name, ((struct stu*)e2)->name);
}
void test1()//按姓名排序
{struct stu s[3] = { {"zhangsan",18,99.9},{"wangwu",17,88.88},{"lisi",16,77.7} };int sz = sizeof(s) / sizeof(s[0]);for (int i = 0; i < sz; i++){printf("排序前:");printf("%s %d %lf ", s[i].name, s[i].age, s[i].score);}printf("\n");qsort(s, sz, sizeof(s[0]), cmp_name);for (int i = 0; i < sz; i++){printf("排序后:");printf("%s %d %lf ", s[i].name, s[i].age, s[i].score);}
}
int main()
{test1();
}
二、使用回调函数模拟qsort(排序方法采用冒泡)
头文件
#include<stdio.h>
#include<string.h>
排序函数:
void bubble_qsort(void* base, int sz, int width, int (*cmp)(void* e1, void* e2))
{int i = 0;int j = 0;for (i = 0; i < sz - 1; i++){for (j = 0; j < sz - i - 1; j++){if (cmp((char*)base + j * width, (char*)base + (j + 1) * width)>0){swap((char*)base + j * width, (char*)base + (j + 1) * width, width);}}}
}
swap()函数
void swap(void* e1, void* e2, int width)
{int i = 0;for (i = 0; i < width; i++){char tmp = *((char*)e1+i);*((char*)e1+i) = *((char*)e2+i);*((char*)e2+i) = tmp;}
}
按姓名排序的cmp_name()函数
int cmp_name(void* e1, void* e2)
{return strcmp(((struct stu*)e1)->name, ((struct stu*)e2)->name);
}
测试
void test1()//按name排序
{struct stu s[3] = { {"zhangsan",19,99.9},{"wangwu",18,88.8},{"lisi",17,77.7} };int sz = sizeof(s) / sizeof(s[0]);bubble_qsort(s, sz, sizeof(s[0]), cmp_name);for (int i = 0; i < sz; i++){printf("%s %d %lf ", s[i].name, s[i].age, s[i].score);}
}
三、总结
对未知数据类型的数组进行排序,原理就是用过void类型接收指针,然后通过已知的每个元素字节大小,将元素指针转化为char类型,一个一个字节的交换。
回调函数及其应用案例相关推荐
- python回调接口_三个案例带你了解python回调函数
原标题:三个案例带你了解python回调函数 回调函数: 把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用来调用其所指向的函数时,我们就说这是回调函数.回调函数不是由该函数的实现方直接调用 ...
- python的函数调用_三个案例带你了解python回调函数
回调函数: 把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用来调用其所指向的函数时,我们就说这是回调函数.回调函数不是由该函数的实现方直接调用,而是在特定的事件或条件发生时由另外的一方调用 ...
- ESP8266基于MicroPython的TCP socket回调函数实现案例
参考链接 其它参考 python socket和简单tcp通信实现 - Katherina.K - 博客园 GitHub - robert-hh/FTP-Server-for-ESP8266-ESP3 ...
- Java回调函数异步回调案例
1.回调函数分类 回调函数区分:同步回调和异步回调 同步回调:意义只在于完成方法调用: 异步调用:可实现并发,主业务线程可以及时释放:异步线程完成工作,执行回调函数,完成善后工作:提高了执行效率. 2 ...
- 【 C 】回调函数简记
最近心特别浮躁,还没到晚上十点,就安定不下来了,但是这篇博文还必须记完! 上篇博文:函数指针,对这篇博文的理解也比较重要. <c 与 指针>对于回调函数讲的也比较细致了,耐心看完,也会收获 ...
- 6、函数返回值、this、递归及回调函数
一.函数的返回值 ==> return 1. return将函数内部的值返回到函数外,函数外若想使用,必须要接收该返回值 2. return若不书写或者直接写return,函数的返回值为unde ...
- Linux C 函数指针应用---回调函数
(这里引用了知乎上一些知友的回答,感觉不错,有助于理解,这里引用作为借鉴,如有冒犯,烦请告知) 我们先来回顾一下函数指针,函数指针是专门用来存放函数地址的指针,函数地址是一个函数的入口地址,函数名代表 ...
- C语言 回调函数 produce(arr,len,getRand)
基本介绍 回调函数:形参中包含另一个函数的函数指针 用函数指针接收另一个函数 案例 代码解析 具体代码 #include<stdio.h> #include<stdlib.h> ...
- axios vue 回调函数_vue中ajax请求与axios包完美处理
这次给大家带来vue中ajax请求与axios包完美处理,vue中ajax请求与axios包处理的注意事项有哪些,下面就是实战案例,一起来看一下. 在vue中,经常会用到数据请求,常用的有:vue-r ...
- python gui button回调函数运行完成后弹出窗口_嵌入式设备GUI开发之GTK+入门(一)...
小伙伴们大家好,最近鑫哥带领大家做了很多的C语言的小项目,那有些小伙伴说我们可以用python做图形界面,我们可以使用C语言做吗? 我的回答是当然没问题嘻嘻,接下来鑫哥就带大家一起去看看如何进行GTK ...
最新文章
- cli3 px转rem适配移动端_Vue:将px转化为rem,适配移动端
- 【攻防世界016】re2-cpp-is-awesome
- mysql git 获取 稳定版本 源码_webmagic新版文档(更新中)
- SQL注入1-5_cookie基于base64的注入
- 部署zookeeper分布式节点
- 生活中c语言排序案例,C语言之数字排序-基于冒泡排序法的一些案例(对未知数量的数字进行排序)...
- 领域应用 | 知识计算,华为云赋能企业知识化转型
- 花高价招来的阿里P8,我从他那里总结了8大硬核能力,4个经典案例,真香
- FreeMarker的优点和缺点
- c语言case多种情况,switch语句中有多种情况
- (一)在Azure上创建完整的无服务器云原生应用程序
- 将android界面背景设置为黑色
- Mac隐藏技巧:右键点按,在访达中玩出点新花样
- java2实用教程 第5版 课本案例
- svn update中断,报cleanup错误
- 内存引起的蓝屏问题排查
- 使用驱动精灵更新无线网卡后出现网卡错误代码56的解决办法
- 解决0xc00d5212
- CDR安装包下载+汉化简体中文版+安装教程
- 树形表实现 bootstrap-table + treegrid
热门文章
- 云输入法linux版,ubuntu云输入法ibus cloud pinyin
- linux面板带csf防火墙,linux csf 防火墙 防止少量的ddos cc攻击很有效
- 确定权重的方法-主成分分析
- MATLAB简单解决输出某个数(组)内自然数的阶乘和问题
- 硬件设计论坛_从全球EDA产业发展看EDA365电子论坛作用
- 金山毒霸2011“可信云安全”的本土化优势
- Node.js 实现远程桌面监控
- SQL语句:查询语句及多表查询典型例子
- ADS EM MODEL 问题
- Java项目中使用OpenOffice转PDF