前天,鵬哥上課的時候給我們講了回調函數。雖然他噼裏啪啦講了一大堆,然而我還是聽得雲裏霧裏。。(不是我們鵬哥講的不好啦,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類型的數據。字符串比較函數也是如此。