前天,鹏哥上课的时候给我们讲了回调函数。虽然他噼里啪啦讲了一大堆,然而我还是听得云里雾里。。(不是我们鹏哥讲的不好啦,O(∩_∩)O哈哈~)
最重要的是 回调函数是什么,什么是回调函数。我不知道它是干什么的,我当然不会写他了。所以我就各种百度,谷歌。
接下来,我就用我的话给你们讲一下 什么是回调函数。。。。。
什么是回调函数(callback)
回调函数是程序上的概念。本质是叫别人做事,自己穿进去额外的信息。
函数A调用函数B
比如A叫B做事,当B在做这件事的时候,自身需要的信息不够,而A又有。就需要A从外面传进来,或者B做着做着主动向外面申请。对于B来说,一种被动得到消息,一种主动得到消息。有人给这两种方式的术语,叫信息的push,和信息的pull。
再举个生动点的例子。
你有一个任务,但是有一部分你不会做,或者说不愿做,所以我来帮你做这部分,你做你其它的任务工作或者等着我的消息,但是当我完成的时候我要通知你我做好了,你可以用了,我怎么通知你呢?你给我一部手机,让我做完后给你打电话,我就打给你了,你拿到我的成果加到你的工作中,继续完成其它的工作.这就叫回叫,手机是我通知你的手段,它就是回叫函数,也叫回调函数.
回调函数的简单使用
使用冒泡排序可以排字符串,整形
函数如下:
实际中,为了方便通常会重命名
typedef int(*Cmp)(const void *elem1, const void *elem2);
交换函数:
不管是排哪种类型,我们在排序的时候总会把两个元素交换,所以我们应该先有一个交换函数。
void swap(char *p1, char *p2, int size)//在这以char为单位,在整形交换和字符串交换的时候就 //都可以用了
{
int i = 0;
char tmp = 0;
for (i = 0; i < size; i++)
{
tmp = *(p1 + i);
*(p1 + i) = *(p2 + i);
*(p2 + i) = tmp;
}
}
比较整数的回调函数:
int compare_int(const void *elem1, const void *elem2)
{
int a = *(int *)elem1;
int b = *(int *)elem2;
return a - b;
}
比较字符串的回调函数:
int compare_str(const void *elem1, const void *elem2)
{
char a = *(char *)*(int *)elem1;
char b = *(char *)*(int *)elem2;
return a - b;
}
冒泡排序:
void bubble_sort(void *arr, int n,int size,Cmp cmp)
{
assert(arr);
int i = 0;
int j = 0;
for (i = 0; i < n - 1; i++)
{
for (j = 0; j < n - 1 - i; j++)
{
if (cmp(((char *)arr + j*size), ((char *)arr + (j + 1)*size)) > 0)
{
swap(((char *)arr + j*size), ((char *)arr + (j + 1)*size), size);
}
}
}
}
主函数:
int main()
{
char *str[] = { "bsjdfvgn", "aaaaaa", "fghgjj", "mniig" };
int arr[] = { 1, 3, 5, 7, 9, 2, 4, 6, 8, 0 };
int i = 0;
int n_int = sizeof(arr) / sizeof(arr[0]);
int n_str = sizeof(str) / sizeof(str[0]);
bubble_sort(str, n_str, sizeof(str[0]), compare_str);
printf("bubble_sort str in:\n");
for (i = 0; i < n_str; i++)
{
printf("%s ", str[i]);
}
printf("\n");
bubble_sort(arr, n_int, sizeof(arr[0]), compare_int);
printf("bubble_sort int in:\n");
for (i = 0; i < n_int; i++)
{
printf("%d ", arr[i]);
}
system("pause");
return 0;
}
注:主要思想:排序的是什么元素都将其强制类型转换成(char*),因为可以把char当作一个基类。然后再根据排序元素的类型,将其强制类型转化成目标类型.
例如:
int compare_int(const void *elem1, const void *elem2)
{
int a = *(int *)elem1;
int b = *(int *)elem2;
return a - b;
}
把基类强制类型转换成int*再*就得到int类型的数据。字符串比较函数也是如此。