C语言从入门到进阶——第15讲:深入理解指针(5)
文章目录1. 回调函数是什么?2. qsort使用举例2.1 使用qsort函数排序整型数据2.2 使用qsort排序结构数据3. qsort函数的模拟实现1. 回调函数是什么?回调函数就是一个通过函数指针调用的函数。如果你把函数的指针(地址)作为参数传递给另一个函数当这个指针被用来调用其所指向的函数时被调用的函数就是回调函数。回调函数不是由该函数的实现方直接调用而是在特定的事件或条件发生时由另外的一方调用的用于对该事件或条件进行响应。//使用回调函数改造前#includestdio.hintadd(inta,intb){returnab;}intsub(inta,intb){returna-b;}intmul(inta,intb){returna*b;}intdiv(inta,intb){returna/b;}intmain(){intinput1;do{printf(*************************\n);printf( 1:add 2:sub \n);printf( 3:mul 4:div \n);printf(*************************\n);printf(请选择:);scanf(%d,input);intx,y,ret0;switch(input){case1:printf(输入操作数:);scanf(%d %d,x,y);retadd(x,y);printf(ret %d\n,ret);break;case2:printf(输入操作数:);scanf(%d %d,x,y);retsub(x,y);printf(ret %d\n,ret);break;case3:printf(输入操作数:);scanf(%d %d,x,y);retmul(x,y);printf(ret %d\n,ret);break;case4:printf(输入操作数:);scanf(%d %d,x,y);retdiv(x,y);printf(ret %d\n,ret);break;case0:printf(退出程序\n);break;default:printf(选择错误\n);break;}}while(input);return0;}//使用回调函数改造后#includestdio.hintadd(inta,intb){returnab;}intsub(inta,intb){returna-b;}intmul(inta,intb){returna*b;}intdiv(inta,intb){returna/b;}voidcalc(int(*pf)(int,int)){intret0;intx,y;printf(输入操作数:);scanf(%d %d,x,y);retpf(x,y);printf(ret %d\n,ret);}intmain(){intinput1;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函数排序整型数据#includestdio.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};inti0;qsort(arr,sizeof(arr)/sizeof(arr[0]),sizeof(int),int_cmp);for(i0;isizeof(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}};intszsizeof(s)/sizeof(s[0]);qsort(s,sz,sizeof(s[0]),cmp_stu_by_age);}//按照名字来排序voidtest3(){structStus[]{{zhangsan,20},{lisi,30},{wangwu,15}};intszsizeof(s)/sizeof(s[0]);qsort(s,sz,sizeof(s[0]),cmp_stu_by_name);}intmain(){test2();test3();return0;}3. qsort函数的模拟实现使用回调函数模拟实现qsort(采用冒泡的方式)。这里第一次使用void*的指针讲解void*的作用。#includestdio.hintint_cmp(constvoid*p1,constvoid*p2){return(*(int*)p1-*(int*)p2);}void_swap(void*p1,void*p2,intsize){inti0;for(i0;isize;i){chartmp*((char*)p1i);*((char*)p1i)*((char*)p2i);*((char*)p2i)tmp;}}voidbubble(void*base,intcount,intsize,int(*cmp)(void*,void*)){inti0;intj0;for(i0;icount-1;i){for(j0;jcount-i-1;j){if(cmp((char*)basej*size,(char*)base(j1)*size)0){_swap((char*)basej*size,(char*)base(j1)*size,size);}}}}intmain(){intarr[]{1,3,5,7,9,2,4,6,8,0};inti0;bubble(arr,sizeof(arr)/sizeof(arr[0]),sizeof(int),int_cmp);for(i0;isizeof(arr)/sizeof(arr[0]);i){printf(%d ,arr[i]);}printf(\n);return0;}
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2426695.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!