深入理解指针(4)
1.回调函数
一个通过函数指针调用的函数
回调函数不是由该函数的实现方直接调用,而是在特定的事件或条件发生时由另外的一方调用的,用于响应
如果你把函数的指针作为参数传递给另一个函数,当这个指针被用来调用其所指向的函数时,被调用的函数是回调函数
举例说明:
//关于回调函数的应用例子
//关于加减乘除运算
//没有使用回调函数:
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;
}
int main()
{
int x, y;
int input = 0;
int ret = 0;
do
{
printf("************\n");
printf("请输入你要选择的数字:\n");
printf("0.退出程序\n");
printf("1.加法运算\n");
printf("2.减法运算\n");
printf("3.乘法运算\n");
printf("4.整除运算\n");
printf("************\n");
scanf("%d", &input);
switch (input)
{
case 0:
printf("程序结束\n");
break;
case 1:
printf("请输入:\n");
scanf("%d %d", &x, &y);
ret = add(x, y);
printf("结果是:%d\n", ret);
case 2:
printf("请输入:\n");
scanf("%d %d", &x, &y);
ret = sub(x, y);
printf("结果是:%d\n", ret);
case 3:
printf("请输入:\n");
scanf("%d %d", &x, &y);
ret = mul(x, y);
printf("结果是:%d\n", ret);
case 4:
printf("请输入:\n");
scanf("%d %d", &x, &y);
ret = div(x, y);
printf("结果是:%d\n", ret);
default:
printf("输入错误,请重新输入:\n");
}
} while (input);
return 0;
}
下面是使用回调函数的例子:
//关于回调函数的应用例子
//关于加减乘除运算
//如果使用回调函数:
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 abc(int(*pf)(int , int ))
{
int ret = 0;
int x, y;
printf("请输入:\n");
scanf("%d %d", &x, &y);
ret = pf(x, y);
printf("结果是:%d\n", ret);
}
int main()
{
int x, y;
int input = 0;
int ret = 0;
do
{
printf("************\n");
printf("请输入你要选择的数字:\n");
printf("0.退出程序\n");
printf("1.加法运算\n");
printf("2.减法运算\n");
printf("3.乘法运算\n");
printf("4.整除运算\n");
printf("************\n");
scanf("%d", &input);
switch (input)
{
case 0:
printf("程序结束\n");
break;
case 1:
abc(add);
case 2:
abc(sub);
case 3:
abc(mul);
case 4:
abc(div);
default:
printf("输入错误,请重新输入:\n");
}
} while (input);
return 0;
}
代码中的abc便是通过回调函数,运用函数指针来调用各个函数,被调用的add,sub,mul,div被称为回调函数
2.qsort的使用举例
qsort是C语言中的一个库函数
这个函数是用来对数据进行排序,对任意数据都能进行排序(默认排升序)
tips:两个字符串大小的比较不能使用<,>,<=,>=,==,!=,应该用strcmp
比较结构体也不能用那些操作符
用法:void qsort (void*base, //指向待排序数组的第一个元素的指针
size_t num, //base指向数组中的元素个数
size_t size //base指向数组中一个元素的大小,单位是字节
int(*cmp)(const void*,conse void*) //函数指针——传递函数地址
这是数组两元素进行比较的函数,比较后默认会按照升序
p1>p2 >0
< <0
= =0
int int_cmp(const void* p1, const void* p2)
{
return (*(int*)p1 - *(int*)p2);
}
int main()
{
int arr[] = { 1,4,3,5,2,6,7,8,0,9 };
int i = 0;
qsort(arr, sizeof(arr) / sizeof(arr[0]), sizeof(int), int_cmp);
for (i = 0; i < sizeof(arr) / sizeof(arr[0]); i++)
{
printf("%d ", arr[i]);
}
printf("\n");
return 0;
}
tips:结构体成员访问操作符:
"." 结构体变量.成员名
"->" 结构体指针->成员名
//strcmp比较字符串是比较对应字符的ASCII值,与长度无关