回调函数就是一个通过函数指针调用的函数,如果你把函数的指针(地址)作为参数,传给
另一个函数,当这个指针被用来调用其所指向的函数时,我们说这就是回调函数。回调函数不由
该函数的实现方式直接调用,在特定条件下由另外的一方调用,用于对该事件或者该条件进行相应。
qsort 快速排序库函数void qsort (void* base, size_t num, size_t size,
int (*compar)(const void*,const void*));
第一个参数待排序数组的首元素的地址,第二个参数待排序数组元素的个数
第三个参数是待排序的每个元素的大小单位是字节,第四个参数是函数指针,比较两个元素使用函数的地址,
函数自己定义,里面两个参数为待比较两个元素地址
void*指针可以接收任意类型地址,但是不能解引用,解引用没具体类型不能知道访问几个字节
#include<stdio.h> #include<stdlib.h> #include<string.h> struct Stu { char name[20]; int age; }; //int cmp_int(const void* e1, const void* e2) //{ // return *(int*)e1 - *(int*)e2; //}int cmp_float(const void* e1, const void* e2) //{ // return (int)*(double*)e1 - *(double*)e2; //}int cmp_stu_by_age(const void* e1, const void* e2) //{ // return ((struct Stu*)e1)->age - ((struct Stu*)e2)->age; //} //int cmp_stu_by_name(const void* e1, const void* e2) //{ // return strcmp(((struct Stu*)e1)->name, ((struct Stu*)e2)->name); //} //void test1() //{ // int a[] = { 9,8,7,6,5,4,3,2,1,0 }; // int sz = sizeof(a) / sizeof(a[0]); // qsort(a, sz, sizeof(a[0]), cmp_int); // int i; // for (i = 0; i < sz; i++) // { // printf("%d ", a[i]); // } // printf("\n"); //} //void test2() //{ // double f[] = { 9.0,6.6,5.5,3.3,2.1}; // int sz = sizeof(f) / sizeof(f[0]); // qsort(f, sz, sizeof(f[0]), cmp_float); // int i; // for (i = 0; i < sz; i++) // { // printf("%lf ", f[i]); // } // printf("\n"); //} //void test3() //{ // struct Stu s[3] = { {"张三",30},{"李四",27},{"王五",25} }; // int sz = sizeof(s) / sizeof(s[0]); // //qsort(s, sz, sizeof(s[0]), cmp_stu_by_age); // qsort(s, sz, sizeof(s[0]), cmp_stu_by_name); // int i; // for (i = 0; i < sz; i++) // { // printf("%d ", s[i].age); // printf("%s ", s[i].name); // } // printf("\n"); //} //int main() //{ // test1(); // test2(); // test3(); //}
这是回调函数的使用,函数里面的实参是一个自己写的函数指针
下面自己写这个快速排序函数
int cmp_stu_by_name(const void* e1, const void* e2) { return strcmp(((struct Stu*)e1)->name, ((struct Stu*)e2)->name); } void swap(char* buf1, char* buf2, int width) { int i = 0; for (i = 0; i < width; i++) { char t = *buf1; *buf1 = *buf2; *buf2 = t; buf1++; buf2++; } } void bubble_sort(void* base, int sz, int width,int(*cmp)(const void*e1,const void*e2)) { int i = 0; for (i = 0; i < sz - 1; i++) { int j = 0; for (j = 0; j < sz - 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() { struct Stu s[3] = { {"zhang",23},{"li",21},{"wang",20} }; int sz = sizeof(s) / sizeof(s[0]); bubble_sort(s,sz,sizeof(s[0]),cmp_stu_by_name); int i; for (i = 0; i < 3; i++) { printf("%d ", s[i].age); printf("%s ", s[i].name); } }
这就是函数的实现,排序很多类型的数