回调函数就是通过函数指针调用的函数
如果你把函数的指针作为参数传递给另外一个函数,当这个指针被用来调用其所指向的函数时,被调用的函数就是回调函数。回调函数并不是一个单一的函数实现的,而是在某种情况下,编写者根据需要所编写的,在特定的时间或条件发生由另外一方的调用的,用于对该事件的相应
这是我们普通实现计算器的思路和代码:
#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 menu()
{
printf("*************************\n");
printf("**1:add***********2:sub**\n");
printf("**3:mul***********4:div**\n");
printf("*********0:exit**********\n");
printf("*************************\n");
}
int main()
{
int x = 0;
int y = 0;
int input = 0;
int ret = 0;
do
{
menu();
printf("请输入:");
scanf("%d", &input);
switch (input)
{
case 0:
break;
case 1:
printf("请输入两个数:");
scanf("%d %d", &x, &y);
ret = Add(x, y);
printf("%d+%d=%d\n", x, y, ret);
break;
case 2:
printf("请输入两个数:");
scanf("%d %d", &x, &y);
ret = Sub(x, y);
printf("%d-%d=%d\n", x, y, ret);
break;
case 3:
printf("请输入两个数:");
scanf("%d %d", &x, &y);
ret = Mul(x, y);
printf("%d*%d=%d\n", x, y, ret);
break;
case 4:
printf("请输入两个数:");
scanf("%d %d", &x, &y);
ret = Div(x, y);
printf("%d/%d=%d\n", x, y, ret);
break;
default:
printf("输入错误,请重新输入\n");
break;
}
} while (input);
return 0;
}
然后我们发现这种代码和思路非常非常的冗余,对于初学者来说很友好,但是对于进阶来说,
这种重复性的代码不是很好的选择,那么有没有方法让他简化一下哪?
当然有,用回调函数,这里Cacl()函数就是回调函数。
int Add(int* x, int* y)//1
{
return *x + *y;
}
int Sub(int* x, int* y)//1
{
return *x + *y;
}
int Mul(int* x, int* y)//1
{
return *x + *y;
}
int Div(int* x, int* y)//1
{
return *x + *y;
}void meau()
{
printf("*************************\n");
printf("**1:add***********2:sub**\n");
printf("**3:mul***********4:div**\n");
printf("*********0:exit**********\n");
printf("*************************\n");
}
void Cacl(int(*pf)(int*, int*))
{
int ret = 0;
int x = 0, y = 0;
printf("请输入两个数");
scanf("%d %d", &x, &y);
ret = pf(&x,&y);
printf("%d\n", ret);
}
int main()
{
int a = 0, b = 0;
int input = 0;
do
{
meau();
printf("请输入");
scanf("%d", &input);
switch (input)
{
case 0:
break;
case 1:
Cacl(Add);
break;
case 2:
Cacl(Sub);
break;
case 3:
Cacl(Mul);
break;
case 4:
Cacl(Div);
break;
default:
printf("输入错误,请重新输入");
break;
}
} while (input);
return 0;
}
qsort函数时C语言提供的一个库函数,头文件时stdlib.h,对任意类型的元素都能进行排序。
void qsort(void*base, size-t nums, size_t size, int(*compare)(const*void elem1,const*void elem2) );
注意:int(*compare)(const*void elem1,const*void elem2))-----比较函数,需要使用qsort函数的程序员自己实现,并且有以下要求。
#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]);
}
}
struct stu
{
char name[20];
int age;
};
//按照年龄比较,排序结构体数组
int cmp_stu_by_age(const void* e1, const void* e2)
{
//return (*((struct stu*)e1)).age > (*((struct stu*)e2)).age;
return ((struct stu*)e1)->age - ((struct stu*)e2)->age;
}
void test2()
{
struct stu arr[] = { {"zhangsan",20},{"lisi",35},{"wangwu",18} };
int sz = sizeof(arr) / sizeof(arr[0]);
qsort(arr, sz, sizeof(arr[0]), cmp_stu_by_age);//通过age排序
}
int main()
{
test2();
return 0;
}
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
void Print(int arr[], int sz)
{
int i = 0;
for (i = 0; i < sz; i++)
{
printf("%d ", arr[i]);
}
}
struct stu
{
char name[20];
int age;
};
//按照名字比较,排序结构体数组
int cmp_stu_by_name(const void* e1, const void* e2)
{
//注意:强转是暂时的需要带上()
return strcmp(((struct stu*)e1)->name, ((struct stu*)e2)->name);
//这里借助strcmp函数比较字符串,返回值恰好与函数的返回值要求相同
}
void test2()
{
struct stu arr[] = { {"zhangsan",20},{"lisi",35},{"wangwu",18} };
int sz = sizeof(arr) / sizeof(arr[0]);
qsort(arr, sz, sizeof(arr[0]), cmp_stu_by_name);
}
int main()
{
test2();
return 0;
}
到这里,指针系列就结束了,感谢各位支持,但是我们都知道,学习永无止境!!!!
我们都会走向属于自己的顶峰!!!!!!