摘要:如果你把函數(shù)的指針地址作為參數(shù)傳遞給另一個函數(shù),當(dāng)這個指針被用來調(diào)用其所指向的函數(shù)時,我們就說這是回調(diào)函數(shù)。回調(diào)函數(shù)不是由該函數(shù)的實現(xiàn)方直接調(diào)用,而是在特定的事件或條件發(fā)生時由另外的一方調(diào)用的,用于對該事件或條件進行響應(yīng)。
回調(diào)函數(shù)是什么?
回調(diào)函數(shù):
就是一個通過函數(shù)指針調(diào)用的函數(shù)。如果你把函數(shù)的指針(地址) 作為參數(shù)傳遞給另一個函數(shù),當(dāng)這個指針被用來調(diào)用其所指向的函數(shù)時,我們就說這是回調(diào)函數(shù)?;卣{(diào)函數(shù)不是由該函數(shù)的實現(xiàn)方直接調(diào)用,而是在特定的事件或條件發(fā)生時由另外的一方調(diào)用的,用于對該事件或條件進行響應(yīng)。
先來舉個qsort函數(shù)的使用案例:
qsort()函數(shù):
聲明:
參數(shù):
這里用到qsort函數(shù)實現(xiàn)對數(shù)組元素的從小到大排序
#include #include //qosrt函數(shù)的使用者得實現(xiàn)一個比較函數(shù)int int_cmp(const void * p1, const void * p2) { return (*( int *)p1 - *(int *) p2);}int main(){ int arr[] = { 1, 3, 5, 7, 9, 2, 4, 6, 8, 0 }; int i = 0; qsort(arr, sizeof(arr) / sizeof(arr[0]), sizeof (int), int_cmp); for (i = 0; i< sizeof(arr) / sizeof(arr[0]); i++) { printf( "%d ", arr[i]); } printf("/n"); return 0; }
運行結(jié)果如下:
qsort函數(shù)排序運用的是快速排序算法
接下來就要來實現(xiàn)一個與之類似的冒泡排序函數(shù)
具體過程注意看下列 完整代碼注釋
#include #include struct Stu{ char name[20]; int age;};//比較結(jié)構(gòu)體年齡int cmp_by_age(const void* e1, const void* e2){ return ((struct Stu*)e1)->age -((struct Stu*)e2)->age;}//比較結(jié)構(gòu)體姓名int cmp_by_name(const void*e1, const void*e2){ return strcmp(((struct Stu*)e1)->name, ((struct Stu*)e2)->name);}//比較整型數(shù)int cmp_int(const void* e1, const void*e2){ return *(int*)e1 - *(int*)e2;}//打印函數(shù)void print_arr(int arr[], int sz){ int i = 0; for (i = 0; i < sz; i++) { printf("%d ", arr[i]); }}//交換函數(shù)void Swap(char* buf1, char* buf2, int width){ int i = 0; for (i = 0; i < width; i++) { char tmp = *buf1; *buf1 = *buf2; *buf2 = tmp; buf1++; buf2++; }}//使用回調(diào)函數(shù)實現(xiàn)一個通用冒泡排序void BubbleSort(void* base, size_t num, size_t width, int (*cmp)(const void*, const void*)){ size_t i = 0; //趟數(shù) for (i = 0; i < num - 1; i++) { //比較的對數(shù) size_t j = 0; for (j = 0; j < num - 1 - i; j++) { //base[j] ==> *(base+j) if (cmp((char*)base+j*width, (char*)base+(j+1)*width)>0) { //交換 Swap((char*)base + j * width, (char*)base + (j + 1) * width, width); } } }}//整型數(shù)組排序測試void test1(){ int arr[] = { 9,8,7,6,5,4,3,2,1,0 }; int sz = sizeof(arr) / sizeof(arr[0]); BubbleSort(arr, sz, sizeof(arr[0]), cmp_int); //打印 print_arr(arr, sz);}//結(jié)構(gòu)體排序測試void test2(){ struct Stu s[3] = { {"zhangsan", 15}, {"lisi", 30},{"wangwu", 10} }; int sz = sizeof(s) / sizeof(s[0]); //按照名字排序 BubbleSort(s, sz, sizeof(s[0]), cmp_by_name); //按照年齡來排序 BubbleSort(s, sz, sizeof(s[0]), cmp_by_age);}int main(){ //測試自定義的BubbleSort()排序整型數(shù)組 test1(); //測試自定義的BubbleSort()排序結(jié)構(gòu)體 test2(); return 0;}
這個冒泡排序函數(shù)是一個通用函數(shù),不光可以對整型數(shù)組進行排序,也可以對結(jié)構(gòu)體數(shù)據(jù)進行排序,需要變化的就只是比較函數(shù)而已
運行結(jié)果如下:
整型數(shù)組排序:
結(jié)構(gòu)體數(shù)據(jù)按名字排序:
結(jié)構(gòu)體數(shù)據(jù)按年齡排序:
本文僅僅記錄學(xué)習(xí)過程,還望各位大佬多多指出不足~
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/119012.html
摘要:讓我們來看一下代碼,首先我們還是冒泡排序一樣,進行了兩次循環(huán),第一次代表排序趟數(shù),第二次代表每趟的排序次數(shù)。這塊的詳細(xì)介紹在本篇文章稍前的冒泡排序中也有詳細(xì)介紹。 ...
摘要:我們以冒泡排序為例,模擬實現(xiàn)函數(shù)。交換每單位字節(jié)對于的二進制序列這樣,冒泡排序就能排序多種數(shù)據(jù)類型,模擬實現(xiàn)了函數(shù),當(dāng)然也可以使用其他的排序方法模擬實現(xiàn)函數(shù)。 ??...
摘要:故使用無具體類型,又稱通用類型,即可以接收任意類型的指針,但是無法進行指針運算解引用,整數(shù)等。求指針?biāo)甲止?jié)而不是解引用訪問權(quán)限大小。數(shù)組就是整個數(shù)組的大小,數(shù)組元素則是數(shù)組元素的大小,指針大小都為。 ...
閱讀 2047·2021-11-08 13:22
閱讀 2508·2021-09-04 16:40
閱讀 1153·2021-09-03 10:29
閱讀 1718·2019-08-30 15:44
閱讀 2125·2019-08-30 11:13
閱讀 2792·2019-08-29 17:07
閱讀 1970·2019-08-29 14:22
閱讀 1251·2019-08-26 14:00