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