先記錄一下訪問量突破2000啦,謝謝大家支持?。。?br> 這里是上期指針進(jìn)階鏈接,方便大家查看:添加鏈接描述
前言
大家好呀,今天分享一下上期指針進(jìn)階中剩余的內(nèi)容——回調(diào)函數(shù),這個(gè)很重要滴,讓我們一起來學(xué)會(huì)學(xué)懂他吧?。?!
一、回調(diào)函數(shù)是什么
標(biāo)準(zhǔn)概念:
回調(diào)函數(shù)就是一個(gè)通過函數(shù)指針調(diào)用的函數(shù)。如果你把函數(shù)的指針(地址)作為參數(shù)傳遞給另一個(gè)
函數(shù),當(dāng)這個(gè)指針被用來調(diào)用其所指向的函數(shù)時(shí),我們就說這是回調(diào)函數(shù)?;卣{(diào)函數(shù)不是由該函數(shù)
的實(shí)現(xiàn)方直接調(diào)用,而是在特定的事件或條件發(fā)生時(shí)由另外的一方調(diào)用的,用于對(duì)該事件或條件進(jìn)
行響應(yīng)。
簡單來說就是:在另一個(gè)函數(shù)中利用函數(shù)指針調(diào)用的函數(shù)叫做回調(diào)函數(shù)
二、回調(diào)函數(shù)的使用
1.使用標(biāo)準(zhǔn)庫中的qsort函數(shù)
qsort函數(shù)不僅可以排序整型數(shù)組,還可以排序結(jié)構(gòu)體等數(shù)據(jù)類型
代碼如下:
#include <stdio.h>
//qosrt函數(shù)的使用者得實(shí)現(xiàn)一個(gè)比較函數(shù)
int int_cmp(const void * p1, const void * p2)
{
return (*( int *)p1 - *(int *) p2);
}//這里必須有使用者根據(jù)自己的排序依據(jù)自己寫的比較函數(shù)
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);
//qsort的第一個(gè)參數(shù)是排序數(shù)組的首元素地址
//第二個(gè)參數(shù)是排序的長度
//第三個(gè)參數(shù)是每個(gè)元素的大小
//第四參數(shù)是使用者自己寫的排序依據(jù)函數(shù)的地址(這里就是使用回調(diào)函數(shù))
for (i = 0; i< sizeof(arr) / sizeof(arr[0]); i++)
{
printf( "%d ", arr[i]);
}
printf("\n");
return 0;
}
整型數(shù)組排序的運(yùn)行結(jié)果展示:
2.利用qsort函數(shù)對(duì)結(jié)構(gòu)體數(shù)組進(jìn)行排序
先看代碼如下:
#include<stdio.h>
#inlcude<string.h>
struct stu {
int age;
char name[20];
double score;
};
//依據(jù)年齡大小排序的比較函數(shù)
int compar_by_age(const void* e1, const void* e2)
{
return ((struct stu*)e1)->age - ((struct stu*)e2)->age;
}
//依據(jù)名字排序的比較函數(shù)
int compar_by_name(const void* e1, const void* e2)
{
return strcmp(((struct stu*)e1)->name, ((struct stu*)e2)->name);
}
int main()
{
//這是定義一個(gè)結(jié)構(gòu)體類型的數(shù)組
struct stu S[3] = { {21,"FRH",100},{19,"MSY",90},{18,"LZY",85} };
int Ssz = sizeof(S) / sizeof(S[0]);
qsort(S, Ssz, sizeof(S[0]), compar_by_age);
qsort(S, Ssz, sizeof(S[0]), compar_by_name);
return 0;
}
排序前后結(jié)果對(duì)比:
這是排序前結(jié)構(gòu)體數(shù)組的順序:
這是按照年齡排序后的順序:
這是按照姓名排序后的順序:
三、實(shí)現(xiàn)qsort函數(shù)
我們先來看一下qsort函數(shù)在標(biāo)準(zhǔn)庫中的模樣:
他沒有返回值,四個(gè)參數(shù)分別是:
1、qsort的第一個(gè)參數(shù)是排序數(shù)組的首元素地址
2、第二個(gè)參數(shù)是排序的長度
3、第三個(gè)參數(shù)是每個(gè)元素的大小
4、第四參數(shù)是使用者自己寫的排序依據(jù)函數(shù)的地址(這里就是使用回調(diào)函數(shù))
作者是依據(jù)冒泡排序?qū)崿F(xiàn)的qosrt函數(shù),我們之間上代碼:
#include<stdio.h>
#inlcude<string.h>
//依據(jù)名字排序的比較函數(shù)
int compar_by_name(const void* e1, const void* e2)
{
return strcmp(((struct stu*)e1)->name, ((struct stu*)e2)->name);
}
//依據(jù)整型大小排序的比較函數(shù)
int int_cmp(const void * p1, const void * p2)
{//這里都會(huì)將接收到的地址轉(zhuǎn)換為所需要比較的類型
return (*( int *)p1 - *(int *) p2);
}
//這里排序中交換兩個(gè)元素的交換函數(shù)
void Swap(char* x, char* y,int size)
{
//利用char* 接收需要交換的元素,可以保證對(duì)其每個(gè)字節(jié)進(jìn)行交換從而實(shí)現(xiàn)整體全部字節(jié)的交換
//size就是該元素所占字節(jié)的大小,決定每次交換循環(huán)幾次
int i = 0;
for (i = 0; i < size; i++)
{
char temp = *x;
*x = *y;
*y = temp;
x++;
y++;
}
}
void Bubble_Sort(void* base, size_t num, size_t size,int (*compar)(const void*, const void*))
{
int i = 0;
for (i = 0; i < num - 1; i++)
{
int j = 0;
for (j = 0; j < num - 1 - i; j++)
{
//為什么要將首元素地址轉(zhuǎn)換為char* 類型呢?
//因?yàn)?這樣可以保證任何類型數(shù)組在排序比較時(shí)能夠訪問到其中的每一個(gè)元素
//這個(gè)設(shè)計(jì)是真的巧妙
if (compar(((char*)base + j * size), ((char*)base + (j+1)*size))>0)
{
Swap(((char*)base + j * size), ((char*)base + (j+1)*size), size);
}
}
}
}
對(duì)其進(jìn)行測試:
int main()
{
int arr[10] = { 9,8,7,6,5,4,3,2,1,0 };
struct stu S[3] = { {21,"FRH",100},{19,"MSY",90},{18,"LZY",85} };
int Ssz = sizeof(S) / sizeof(S[0]);
int sz = sizeof(arr) / sizeof(arr[0]);
Bubble_Sort(arr,sz,sizeof(arr[0]),compar_by_int);
Print(arr, sz);
Bubble_Sort(S, Ssz, sizeof(S[0]), compar_by_age);
Bubble_Sort(S, Ssz, sizeof(S[0]), compar_by_name);
return 0;
}
可以得到,排序結(jié)果和上面調(diào)用標(biāo)注庫中qsort函數(shù)的結(jié)果是相同的文章來源:http://www.zghlxwxcb.cn/news/detail-653340.html
總結(jié)
關(guān)于回調(diào)函數(shù)的分享就到這里啦,希望qsort函數(shù)可以幫助到大家,博主感覺他真的是很有用,以后會(huì)盡量使用到他的,希望本篇文章可以幫助到大家,謝謝大家閱讀!?。?span toymoban-style="hidden">文章來源地址http://www.zghlxwxcb.cn/news/detail-653340.html
到了這里,關(guān)于【C語言】回調(diào)函數(shù),qsort排序函數(shù)的使用和自己實(shí)現(xiàn),超詳解的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!