前天,鹏哥上课的时候给我们讲了回调函数。虽然他噼里啪啦讲了一大堆,然而我还是听得云里雾里。。(不是我们鹏哥讲的不好啦,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类型的数据。字符串比较函数也是如此。