目录
定义:回调函数就是一个通过函数指针调用的函数。如果你把函数的指针(地址)作为参数传递给另一个 函数,当这个指针被用来调用其所指向的函数时,我们就说这是回调函数。回调函数不是由该函数的实现方直接调用,而是在特定的事件或条件发生时由另外的一方调用的,用于对该事件或条件进行响应。
- #include
- void menu()
- {
- 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)
- {
- return x / y;
- }
- void calc(int (*p)(int, int))
- {
- int x = 0;
- int y = 0;
- int ret = 0;
- printf("请输入两个操作数:>");
- scanf("%d %d", &x, &y);
- ret = p(x, y);
- printf("%d\n", ret);
- }
- int main()
- {
- int input = 0;
-
- do
- {
- menu();
- printf("请选择:>");
- scanf("%d", &input);
- 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;
- }
qsort - C语言标准库提供的排序函数。
- // qsort函数 可以排序任意类型的数据
- // void qsort( void *base, 用来接收待排数组的起始位置,void*的指针非常宽容,可以接收任意类型的指针
- // size_t num, 待排数组的元素个数
- // size_t width, 待排数组的元素大小(字节)
- // int (*compare )(const void *elem1, const void *elem2 ) );
- //比较两个元素大小的函数指针
缺陷是bubble_sort函数只能排序整型的数据,不能排列其他类型的数据
- //bubble_sort函数只能排序整型的数据
- void bubble_sort(int arr[], int sz)
- {
- int i = 0;
- //趟数
- for (i = 0; i < sz - 1; i++)
- {
- //一趟冒泡排序的过程
- int j = 0;
- for (j = 0; j < sz - 1 - i; j++)
- {
- if (arr[j] > arr[j + 1])
- {
- int tmp = arr[j];
- arr[j] = arr[j + 1];
- arr[j + 1] = tmp;
- }
- }
- }
- }
- void print(int arr[], int sz)
- {
- int i = 0;
- for (i = 0; i < sz; i++)
- {
- printf("%d ", arr[i]);
- }
- printf("\n");
- }
- int main()
- {
- //冒泡排序
- //对整型数据进行排序
- int arr[] = { 2,1,3,7,5,9,6,8,0,4 };
- int sz = sizeof(arr) / sizeof(arr[0]);
- bubble_sort(arr, sz);
- print(arr, sz);
- return 0;
- }
- #include<stdio.h>
- #include<stdlib.h>
- void print(int arr[], int sz)
- {
- int i = 0;
- for (i = 0; i < sz; i++)
- {
- printf("%d ", arr[i]);
- }
- printf("\n");
- }
- //int cmp_int(const void* e1, const void* e2)
- //{
- // if (*(int*)e1 > *(int*)e2)
- // return 1;
- // else if (*(int*)e1 < *(int*)e2)
- // return -1;
- // else
- // return 0;
- //}
- int cmp_int(const void* e1, const void* e2)
- {
- return (*(int*)e1 - *(int*)e2);//升序
- //return (*(int*)e2 - *(int*)e1);//降序
- }
- void test2()
- {
- int arr[] = { 2,1,3,7,5,9,6,8,0,4 };
- int sz = sizeof(arr) / sizeof(arr[0]);
-
- // qsort函数 可以排序任意类型的数据
- // void qsort( void *base, 用来接收待排数组的起始位置,void*的指针非常宽容,可以接收任意类型的指针
- // size_t num, 待排数组的元素个数
- // size_t width, 待排数组的元素大小(字节)
- // int (*compare )(const void *elem1, const void *elem2 ) );
- //比较两个元素大小的函数指针
-
- qsort(arr, sz, sizeof(arr[0]), cmp_int);
- //把cmp_int()函数的指针(地址)作为参数传递给另一个qsort()函数,当指针cmp_int被用来调用其所指向的函数cmp_int()时,我们就说函数cmp_int()是回调函数
- print(arr, sz);
-
- }
- int main()
- {
- //test1();
- test2();
-
- return 0;
- }
按照名字排序:
- struct Stu
- {
- char name[20];
- int age;
- };
- void cmp_stu_by_name(const void* e1, const void* e2)
- {
- return strcmp(((struct Stu*)e1)->name, ((struct Stu*)e2)->name);
- }
- //测试去qsort排序结构体数据
- void test3()
- {
- struct Stu s[] = {{"zhangsan", 20}, {"lisi", 55}, {"wangwu",40}};
- //假设按照名字比较
- int sz = sizeof(s) / sizeof(s[0]);
- qsort(s, sz, sizeof(s[0]), cmp_stu_by_name);
-
- }
- int main()
- {
- //test1();
- //test2();
- test3();
-
- return 0;
- }

按照年龄排序:
- struct Stu
- {
- char name[20];
- int age;
- };
- //按照名字排序
- void cmp_stu_by_name(const void* e1, const void* e2)
- {
- return strcmp(((struct Stu*)e1)->name, ((struct Stu*)e2)->name);
- }
- //按照年龄排序
- void cmp_stu_by_age(const void* e1, const void* e2)
- {
- return ((struct Stu*)e1)->age - ((struct Stu*)e2)->age;
- }
- //测试去qsort排序结构体数据
- void test3()
- {
- struct Stu s[] = {{"zhangsan", 20}, {"lisi", 55}, {"wangwu",40}};
- //假设按照名字比较
- int sz = sizeof(s) / sizeof(s[0]);
- //qsort(s, sz, sizeof(s[0]), cmp_stu_by_name);按照名字排序
- qsort(s, sz, sizeof(s[0]), cmp_stu_by_age);//按照年龄排序
-
- }
- int main()
- {
- //test1();
- //test2();
- test3();
-
- return 0;
- }

把bubble_sort函数改造成qsort函数那样,对于任何类型的数据都可以排序。
- int cmp_int(const void* e1, const void* e2)
- {
- return (*(int*)e1 - *(int*)e2);//升序
- //return (*(int*)e2 - *(int*)e1);//降序
- }
- void print(int arr[], int sz)
- {
- int i = 0;
- for (i = 0; i < sz; i++)
- {
- printf("%d ", arr[i]);
- }
- printf("\n");
- }
- void Swap(char*buf1, char*buf2, int width)
- {
- int i = 0;
- for (i = 0; i < width; i++)
- {
- char tmp = *buf1;
- *buf1 = *buf2;
- *buf2 = tmp;
- buf1++;
- buf2++;
- }
- }
- void bubble_sort2(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);
- }
-
- }
- }
- }
- void test4()
- {
- int arr[] = { 2,1,3,7,5,9,6,8,0,4 };
- int sz = sizeof(arr) / sizeof(arr[0]);
- bubble_sort2(arr, sz, sizeof(arr[0]), cmp_int);
- print(arr, sz);
- }
- int main()
- {
- //test1();
- //test2();
- //test3();
- test4();
- return 0;
- }