回调函数及其应用案例

  • 前言
  • 一、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类型,一个一个字节的交换。

回调函数及其应用案例相关推荐

  1. python回调接口_三个案例带你了解python回调函数

    原标题:三个案例带你了解python回调函数 回调函数: 把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用来调用其所指向的函数时,我们就说这是回调函数.回调函数不是由该函数的实现方直接调用 ...

  2. python的函数调用_三个案例带你了解python回调函数

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

  3. ESP8266基于MicroPython的TCP socket回调函数实现案例

    参考链接 其它参考 python socket和简单tcp通信实现 - Katherina.K - 博客园 GitHub - robert-hh/FTP-Server-for-ESP8266-ESP3 ...

  4. Java回调函数异步回调案例

    1.回调函数分类 回调函数区分:同步回调和异步回调 同步回调:意义只在于完成方法调用: 异步调用:可实现并发,主业务线程可以及时释放:异步线程完成工作,执行回调函数,完成善后工作:提高了执行效率. 2 ...

  5. 【 C 】回调函数简记

    最近心特别浮躁,还没到晚上十点,就安定不下来了,但是这篇博文还必须记完! 上篇博文:函数指针,对这篇博文的理解也比较重要. <c 与 指针>对于回调函数讲的也比较细致了,耐心看完,也会收获 ...

  6. 6、函数返回值、this、递归及回调函数

    一.函数的返回值 ==> return 1. return将函数内部的值返回到函数外,函数外若想使用,必须要接收该返回值 2. return若不书写或者直接写return,函数的返回值为unde ...

  7. Linux C 函数指针应用---回调函数

    (这里引用了知乎上一些知友的回答,感觉不错,有助于理解,这里引用作为借鉴,如有冒犯,烦请告知) 我们先来回顾一下函数指针,函数指针是专门用来存放函数地址的指针,函数地址是一个函数的入口地址,函数名代表 ...

  8. C语言 回调函数 produce(arr,len,getRand)

    基本介绍 回调函数:形参中包含另一个函数的函数指针 用函数指针接收另一个函数 案例 代码解析 具体代码 #include<stdio.h> #include<stdlib.h> ...

  9. axios vue 回调函数_vue中ajax请求与axios包完美处理

    这次给大家带来vue中ajax请求与axios包完美处理,vue中ajax请求与axios包处理的注意事项有哪些,下面就是实战案例,一起来看一下. 在vue中,经常会用到数据请求,常用的有:vue-r ...

  10. python gui button回调函数运行完成后弹出窗口_嵌入式设备GUI开发之GTK+入门(一)...

    小伙伴们大家好,最近鑫哥带领大家做了很多的C语言的小项目,那有些小伙伴说我们可以用python做图形界面,我们可以使用C语言做吗? 我的回答是当然没问题嘻嘻,接下来鑫哥就带大家一起去看看如何进行GTK ...

最新文章

  1. cli3 px转rem适配移动端_Vue:将px转化为rem,适配移动端
  2. 【攻防世界016】re2-cpp-is-awesome
  3. mysql git 获取 稳定版本 源码_webmagic新版文档(更新中)
  4. SQL注入1-5_cookie基于base64的注入
  5. 部署zookeeper分布式节点
  6. 生活中c语言排序案例,C语言之数字排序-基于冒泡排序法的一些案例(对未知数量的数字进行排序)...
  7. 领域应用 | 知识计算,华为云赋能企业知识化转型
  8. 花高价招来的阿里P8,我从他那里总结了8大硬核能力,4个经典案例,真香
  9. FreeMarker的优点和缺点
  10. c语言case多种情况,switch语句中有多种情况
  11. (一)在Azure上创建完整的无服务器云原生应用程序
  12. 将android界面背景设置为黑色
  13. Mac隐藏技巧:右键点按,在访达中玩出点新花样
  14. java2实用教程 第5版 课本案例
  15. svn update中断,报cleanup错误
  16. 内存引起的蓝屏问题排查
  17. 使用驱动精灵更新无线网卡后出现网卡错误代码56的解决办法
  18. 解决0xc00d5212
  19. CDR安装包下载+汉化简体中文版+安装教程
  20. 树形表实现 bootstrap-table + treegrid

热门文章

  1. 云输入法linux版,ubuntu云输入法ibus cloud pinyin
  2. linux面板带csf防火墙,linux csf 防火墙 防止少量的ddos cc攻击很有效
  3. 确定权重的方法-主成分分析
  4. MATLAB简单解决输出某个数(组)内自然数的阶乘和问题
  5. 硬件设计论坛_从全球EDA产业发展看EDA365电子论坛作用
  6. 金山毒霸2011“可信云安全”的本土化优势
  7. Node.js 实现远程桌面监控
  8. SQL语句:查询语句及多表查询典型例子
  9. ADS EM MODEL 问题
  10. Java项目中使用OpenOffice转PDF