1.回调函数
回调函数就是⼀个通过函数指针调⽤的函数。如果你把函数的指针(地址)作为参数传递给另⼀个函数,当这个指针被用来调用其所指向的函数 时,被调用的函数就是回调函数。
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
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, y;
printf("请输入你要计算的数:");
scanf("%d %d", &x, &y);
int ret = p(x, y);
printf("结果是:%d\n", ret);
}
int main()
{
int input = 1;
do
{
printf("******************************\n");
printf("****1:add 2:sub ****\n");
printf("****3:mul 4:div ****\n");
printf("******************************\n");
printf("请选择:");
scanf("%d", &input);
switch (input)
{
case 1:
calc(add);
case 2:
calc(sub);
case 3:
calc(mul);
case 4:
calc(div);
case 0:
printf("退出程序");
break;
default:
printf("选择错误");
break;
}
} while (input);
return 0;
}
2.库函数qsort
qsort是用来排序的库函数,可以排序任意类型的函数。
函数的参数
void qsort (void* base, //指针,指向待排序地址的第一个元素
size_t num, //是base指向的待排序数组的元素个数
size_t size, //是base指向的待排序数组的元素的大小
int (*compar)(const void*,const void*));//函数指针 指向的是
//两个函数的比较函数
使用qsort函数排序整sh
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>//qsort需要包含的文件
int int_cmp(const void* p1, const void* p2)
{
return (*(int*)p1 - *(int*)p2); //void*类型的指针是无具体类型的指针,
//这类指针不能直接解引用
} //,也不能直接加减整数的运算
int main()
{
int arr[10] = { 5,8,3,6,7,2,9,1,4,10 };
int sz = sizeof(arr) / sizeof(arr[0]);
qsort(arr, sz, sizeof(arr[0]), int_cmp);
int i = 0;
for (i = 0; i < sz; i++)
{
printf("%d ", arr[i]); 1 2 3 4 5 6 7 8 9 10
}
return 0;
}
使用qsort排序结构数据
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct stu
{
char name[20];
int age;
};
int year_cmp(const void* p1, const void* p2)
{
return (((struct stu*)p1) - ((struct stu*)p2));
}
int name_cmp(const void* p1, const void* p2)
{
return strcmp(((struct stu*)p1)->name, ((struct stu*)p2)->name);//strcmp是通过ASCLL表来比较字符大小
//的函数,返回值是-1,1,0
}
//按年龄排序
void year_sort()
{
struct stu s[] = { {"zhangsan",18},{"lisi",25},{"wangwu",14},{"zhaoliu",28} };
int sz = sizeof(s) / sizeof(s[0]);
qsort(s, sz, sizeof(s[0]), year_cmp);
}
//按名字首字母排序
void name_sort()
{
struct stu s[] = { {"zhangsan",18},{"lisi",25},{"wangwu",14},{"zhaoliu",28} };
int sz = sizeof(s) / sizeof(s[0]);
qsort(s, sz, sizeof(s[0]),name_cmp);
}
int main()
{
name_sort();
year_sort();
return 0;
}
3.使用回调函数模拟实现qsort (采用冒泡的方式)
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int int_cmp(const void* p1, const void* p2)
{
return (*(int*)p1 - *(int*)p2);
}
void _swap(void* p3, void* p4, int size)
{
int i = 0;
for (i = 0; i < size; i++)
{
char tmp = *((char*)p3 + i);
*((char*)p3 + i) = *((char*)p4 + i);
*((char*)p4 + i) = tmp;
}
}
void bubble(void* base,size_t sz ,size_t size,int(*cmp)(const void*,const void*))
{
int i = 0;
int j = 0;
for (i = 0; i < sz - 1;i++)
{
for (j = 0; j < sz - 1 - i; j++)
{
if (cmp((char*)base + j * size, (char*)base + (j + 1) * size) > 0)
{
_swap((char*)base + j * size, (char*)base + (j + 1) * size, size);
}
}
}
}
int main()
{
int arr[] = { 1,5,8,9,3,6,2,4,7 };
int sz = sizeof(arr) / sizeof(arr[0]);
int i = 0;
bubble(arr, sz, sizeof(arr[0]), int_cmp);
for (i = 0; i < sz; i++)
{
printf("%d ", arr[i]);
}
printf("\n");
return 0;
}