当前位置: 首页 > news >正文

C语言从入门到进阶——第15讲:深入理解指针(5)

文章目录

  • 1. 回调函数是什么?
  • 2. qsort使用举例
    • 2.1 使用qsort函数排序整型数据
    • 2.2 使用qsort排序结构数据
  • 3. qsort函数的模拟实现

1. 回调函数是什么?

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

//使用回调函数改造前#include<stdio.h>intadd(inta,intb){returna+b;}intsub(inta,intb){returna-b;}intmul(inta,intb){returna*b;}intdiv(inta,intb){returna/b;}intmain(){intinput=1;do{printf("*************************\n");printf(" 1:add 2:sub \n");printf(" 3:mul 4:div \n");printf("*************************\n");printf("请选择:");scanf("%d",&input);intx,y,ret=0;switch(input){case1:printf("输入操作数:");scanf("%d %d",&x,&y);ret=add(x,y);printf("ret = %d\n",ret);break;case2:printf("输入操作数:");scanf("%d %d",&x,&y);ret=sub(x,y);printf("ret = %d\n",ret);break;case3:printf("输入操作数:");scanf("%d %d",&x,&y);ret=mul(x,y);printf("ret = %d\n",ret);break;case4:printf("输入操作数:");scanf("%d %d",&x,&y);ret=div(x,y);printf("ret = %d\n",ret);break;case0:printf("退出程序\n");break;default:printf("选择错误\n");break;}}while(input);return0;}
//使用回调函数改造后#include<stdio.h>intadd(inta,intb){returna+b;}intsub(inta,intb){returna-b;}intmul(inta,intb){returna*b;}intdiv(inta,intb){returna/b;}voidcalc(int(*pf)(int,int)){intret=0;intx,y;printf("输入操作数:");scanf("%d %d",&x,&y);ret=pf(x,y);printf("ret = %d\n",ret);}intmain(){intinput=1;do{printf("*************************\n");printf(" 1:add 2:sub \n");printf(" 3:mul 4:div \n");printf("*************************\n");printf("请选择:");scanf("%d",&input);switch(input){case1:calc(add);break;case2:calc(sub);break;case3:calc(mul);break;case4:calc(div);break;case0:printf("退出程序\n");break;default:printf("选择错误\n");break;}}while(input);return0;}

2. qsort使用举例

2.1 使用qsort函数排序整型数据

#include<stdio.h>//qsort函数的使用者得实现一个比较函数intint_cmp(constvoid*p1,constvoid*p2){return(*(int*)p1-*(int*)p2);}intmain(){intarr[]={1,3,5,7,9,2,4,6,8,0};inti=0;qsort(arr,sizeof(arr)/sizeof(arr[0]),sizeof(int),int_cmp);for(i=0;i<sizeof(arr)/sizeof(arr[0]);i++){printf("%d ",arr[i]);}printf("\n");return0;}

2.2 使用qsort排序结构数据

这里需要补充介绍结构指针和结构体成员访问操作符->;

structStu//学生{charname[20];//名字intage;//年龄};//假设按照年龄来比较intcmp_stu_by_age(constvoid*e1,constvoid*e2){return((structStu*)e1)->age-((structStu*)e2)->age;}//strcmp - 是库函数,是专门用来比较两个字符串的大小的//假设按照名字来比较intcmp_stu_by_name(constvoid*e1,constvoid*e2){returnstrcmp(((structStu*)e1)->name,((structStu*)e2)->name);}//按照年龄来排序voidtest2(){structStus[]={{"zhangsan",20},{"lisi",30},{"wangwu",15}};intsz=sizeof(s)/sizeof(s[0]);qsort(s,sz,sizeof(s[0]),cmp_stu_by_age);}//按照名字来排序voidtest3(){structStus[]={{"zhangsan",20},{"lisi",30},{"wangwu",15}};intsz=sizeof(s)/sizeof(s[0]);qsort(s,sz,sizeof(s[0]),cmp_stu_by_name);}intmain(){test2();test3();return0;}

3. qsort函数的模拟实现

使用回调函数,模拟实现qsort(采用冒泡的方式)。
这里第一次使用void*的指针,讲解void*的作用。

#include<stdio.h>intint_cmp(constvoid*p1,constvoid*p2){return(*(int*)p1-*(int*)p2);}void_swap(void*p1,void*p2,intsize){inti=0;for(i=0;i<size;i++){chartmp=*((char*)p1+i);*((char*)p1+i)=*((char*)p2+i);*((char*)p2+i)=tmp;}}voidbubble(void*base,intcount,intsize,int(*cmp)(void*,void*)){inti=0;intj=0;for(i=0;i<count-1;i++){for(j=0;j<count-i-1;j++){if(cmp((char*)base+j*size,(char*)base+(j+1)*size)>0){_swap((char*)base+j*size,(char*)base+(j+1)*size,size);}}}}intmain(){intarr[]={1,3,5,7,9,2,4,6,8,0};inti=0;bubble(arr,sizeof(arr)/sizeof(arr[0]),sizeof(int),int_cmp);for(i=0;i<sizeof(arr)/sizeof(arr[0]);i++){printf("%d ",arr[i]);}printf("\n");return0;}
http://www.jsqmd.com/news/501646/

相关文章:

  • day14还是先学ssm吧
  • 和我一起学软件架构:C编译流程
  • DC-DC锂电池充电电源电路设计。 包含锂电池充电电路,升压电路,电压均衡电路等电路组成
  • 软件测试入门封神指南!从理论到实战,核心知识点一篇全覆盖
  • 说说背胶绿色的一线品牌有哪些,广州地区好用又靠谱的推荐 - 工业设备
  • Phi-3 Forest Laboratory 工具链整合:Visual Studio Code高效开发插件推荐与配置
  • CPT306 Principles of Computer Games Design 电脑游戏设计原理 Pt.2 游戏引擎
  • LLM Agent 非法动作频发?Google DeepMind 用 AutoHarness 自动生成代码“安全带”,小模型直接反超大模型!
  • 工具管理化技术工具选型与集成评估
  • 2026年4月初级药师短期冲刺备考工具测评:精准押题才是提分关键! - 孤篇横绝
  • 嵌入式工程师必学(176):深入ADC
  • 协程学习笔记2
  • 手把手教你用OMNet++和NESTING搭建TSN仿真环境(Ubuntu 16.04/18.04版)
  • 不同类型电动汽车充电负荷蒙特卡洛法模拟研究(包括常规充电、快速充电、更换电池) 运用蒙特卡洛法...
  • 分期乐额度回收常见误区,教你轻松实现快速变现 - 团团收购物卡回收
  • 2026年4月初级药师考前冲刺平台哪家靠谱?深度测评5大热门工具! - 孤篇横绝
  • 免费体验:yz-bijini-cosplay镜像,RTX 4090用户的AI绘画利器
  • 指数暴跌,散户运用量化交易拯救自己,量化交易开通
  • StructBERT语义匹配系统效果对比:专业术语与日常用语匹配精度
  • MySQL 中如何解决深度分页问题
  • 闲置购物卡怎么办?永辉卡高价回收指南! - 团团收购物卡回收
  • Phi-3-mini-128k-instruct惊艳效果展示:复杂编程题自动解题+注释生成全过程
  • 深度学习应用
  • 微信立减金转到微信的四种方式对比,高效变现攻略 - 淘淘收小程序
  • ofa_image-caption镜像免配置:Streamlit主题/布局/响应式设计已预优化
  • 2026年青岛龙文辅导服务好用吗,家长口碑告诉你答案 - 工业品网
  • AI负责可能,人类负责正确
  • UUV三维路径跟踪 matlab编程实现 los+反步控制 模型可调,跟踪曲线可调
  • Arduino--模拟输入输出
  • UI-TARS-desktop在金融科技中的应用:投资教育视频自动化生产