)
目录1.回调函数2.qsort使用举例qsort使用条件3.qsort函数的模拟实现正文1.回调函数概念通过函数指针把原函数传给其他函数再用其他函数去间接调用原函数。使用回调函数编写简易计算器#includestdio.h int input; int x,y; int ret 0; void first() { printf(****************\n); printf(1:add 2:sub\n); printf(3:mul 4:div\n); printf(0:exit \n); printf(****************\n); } int add(int x,int y) { return x y; } int sub(int x,int y) { return x - y; } int mul(int x,int y) { return x * y; } int div(int x,int y) { if(y ! 0) return x / y } //创建回调函数 void Calc(int(*fun)(int,int)) { printf(请输入操作数\n); scanf(%d%d,x,y); ret fun(x,y); printf(%d\n,ret); } int main() { do{ first(); printf(请选择模式\n); switch(input) { case 1: Calc(add); break; case 2: Calc(sub); break; case 3: Calc(mul); break; case 4: Calc(div); break; case 0: printf(退出计算器\n); break; default: printf(选择错误请重新选择\n); break; } }while(input); return 0; }上述代码中回调函数是add、sub、mul、div 回调的载体函数是Calc 。2.qsort使用举例qsort使用条件1.包含头文件#includestdlib.h2.void qsort( void *base, size_t n, size_t size, int (*cmp)(const void *a, const void *b));base 数组首元素地址。n 数组元素个数。size 数组每个元素的字节大小。cmp 比较回调函数的大小。需要自己写内部元素需要按需进行强制类型转换1.使用 qsort 排列整型数据#includestdio.h #includestdlib.h int int_cmp(const void* p1,const void* p2) { return (*(int*)p1 - *(int*)p2); } int main() { int arr[10] {10,9,8,7,6,5,4,3,2,1}; size_t sz sizeof(arr) / sizeof(arr[0]); size_t n sizeof(arr[0]); qsort(arr,sz,n,int_cmp); for(size_t i 0;i sz;i) printf(%d ,*(arr i)); return 0; }2.使用qsort排列结构体数据#includestdio.h #includestdlib.h #includestring.h struct Stu { char name[20]; int age; }; //假设用年龄来比较 int cmp_Stu_age(const void* p1,const void* p2) { //下面两个式子等价 return (*(struct Stu*)p1).age - (*(struct Stu*)p2).age; //return ((struct Stu*)p2)-age - ((struct Stu*)p2)-age; } //假设用名字比较 int cmp_Stu_name(const void* p1,const void* p2) { return strcmp(((struct Stu*)p1)-name,((struct Stu*)p2)-name); } //按照年龄排序 void ret1() { struct Stu s1[] {{huangjunzhi,20},{xiaoyazi,19},{panjilei,18}}; size_t sz sizeof(s1) / sizeof(s1[0]); qsort(s1,sz,sizeof(s1[0]),cmp_Stu_age); } //按照名字排序 void ret2() { struct Stu s2[] {{huangjunzhi,20},{xiaoyazi,19},{panjilei,18}}; size_t sz sizeof(s2) / sizeof(s2[0]); qsort(s2,sz,sizeof(s2[0]),cmp_Stu_name); } int main() { ret1(); ret2(); return 0; }字符比较大小需要使用strcmp函数。3.qsort函数的模拟实现使用回调函数模拟实现qsort采用冒泡排序的方式#includestdio.h void Swap(char* buf1,char* buf2,size_t width) { for(size_t i 0;i width;i) { char tmp *buf1; *buf1 *buf2; *buf2 tmp; buf1; buf2; } } int int_cmp(const void* p1,const void* p2) { return *(int*)p1 - *(int*)p2; } void bubble_qsort(void* base,size_t num,size_t width,int cmp(const void* p1,const void* p2)) { for(size_t i 0;i num - 1;i) { for(size_t j 0;j num - 1 - i;j) { if(cmp((char*)base j*width,(char*)base (j 1)*width) 0) Swap((char*)base j*width,(char*)base (j 1)*width,width); } } } int main() { int arr[10] {10,9,8,7,6,5,4,3,2,1}; size_t num sizeof(arr) / sizeof(arr[0]); size_t width sizeof(arr[0]); //排序 bubble_qsort(arr,num,width,int_cmp); //打印检验结果 for(size_t i 0;i num;i) { printf(%d ,*(arr i)); } printf(\n); return 0; }该排序函数优势在于可以排列任意类型的元素。最后感谢阅读欢迎大家的交流与指正。