回調函數(shù)就是一個被作為參數(shù)傳遞的函數(shù)。在C語言中,回調函數(shù)只能使用函數(shù)指針實現(xiàn),在C++、Python、ECMAScript等更現(xiàn)代的編程語言中還可以使用仿函數(shù)或匿名函數(shù)。

十年的秀山土家族苗族網(wǎng)站建設經(jīng)驗,針對設計、前端、開發(fā)、售后、文案、推廣等六對一服務,響應快,48小時及時工作處理。營銷型網(wǎng)站建設的優(yōu)勢是能夠根據(jù)用戶設備顯示端的尺寸不同,自動調整秀山土家族苗族建站的顯示方式,使網(wǎng)站能夠適用不同顯示終端,在瀏覽器中調整網(wǎng)站的寬度,無論在任何一種瀏覽器上瀏覽網(wǎng)站,都能展現(xiàn)優(yōu)雅布局與設計,從而大程度地提升瀏覽體驗。創(chuàng)新互聯(lián)建站從事“秀山土家族苗族網(wǎng)站設計”,“秀山土家族苗族網(wǎng)站推廣”以來,每個客戶項目都認真落實執(zhí)行。
回調函數(shù)的使用可以大大提升編程的效率,這使得它在現(xiàn)代編程中被非常多地使用。同時,有一些需求必須要使用回調函數(shù)來實現(xiàn)。
最著名的回調函數(shù)調用有C/C++標準庫stdlib.h/cstdlib中的快速排序函數(shù)qsort和二分查找函數(shù)bsearch中都會要求的一個與strcmp類似的參數(shù),用于設置數(shù)據(jù)的比較方法。
意義
因為可以把調用者與被調用者分開,所以調用者不關心誰是被調用者。它只需知道存在一個具有特定原型和限制條件的被調用函數(shù)。簡而言之,回調函數(shù)就是允許用戶把需要調用的函數(shù)的指針作為參數(shù)傳遞給一個函數(shù),以便該函數(shù)在處理相似事件的時候可以靈活的使用不同的方法。
回調函數(shù)就是一個通過函數(shù)指針調用的函數(shù)。
如果把函數(shù)的指針(地址)作為參數(shù)傳遞給另一個函數(shù),當這個指針被用來調用其所指向的函數(shù)時,那就說這是回調函數(shù)。回調函數(shù)不是由該函數(shù)的實現(xiàn)方直接調用,而是在特定的事件或條件發(fā)生時由另外的一方調用的,用于對該事件或條件進行響應。
不管怎么說,回調函數(shù)是繼承自C語言的。在C++中,應只在與C代碼建立接口或與已有的回調接口打交道時,才使用回調函數(shù)。除了上述情況,在C++中應使用虛擬方法或仿函數(shù)(functor),而不是回調函數(shù)。
擴展資料
回調函數(shù)的好處:
1、回調函數(shù)可以把調用者與被調用者分開,所以調用者不關心誰是被調用者。它只需知道存在一個具有特定原型和限制條件的被調用函數(shù)。簡而言之,回調函數(shù)就是允許用戶把需要調用的函數(shù)的指針作為參數(shù)傳遞給一個函數(shù),以便該函數(shù)在處理相似事件的時候可以靈活的使用不同的方法。
2、回調可用于通知機制。例如,有時要在A程序中設置一個計時器,每到一定時間,A程序會得到相應的通知,但通知機制的實現(xiàn)者對A程序一無所知。那么,就需一個具有特定原型的函數(shù)指針進行回調,通知A程序事件已經(jīng)發(fā)生。實際上,API使用一個回調函數(shù)SetTimer()來通知計時器。
參考資料來源:百度百科-回調函數(shù)
我舉個排序的例子
#include stdio.h
#include string.h
typedef struct person {
int age;
char name[20];
double height;
} person;
int sortOnAge(person* a, person* b) // 以年齡排序,用于回調
{
return a-age b-age;
}
int sortOnName(person* a, person* b)// 以姓名排序,用于回調
{
return strcmp(a-name, b-name);
}
int sortOnHeight(person* a, person* b)// 以身高排序,用于回調
{
return a-height b-height;
}
void sort(person* a, int n, int (*comparator)(person* a, person* b)) // 排序用函數(shù),接受待排數(shù)組和比較用回調函數(shù)
{
int i, j;
person t;
for(i = 0; i n; ++i) {
for(j = 0; j n-i-1; ++j) // 簡單冒泡排序
if(comparator(a+j, a+j+1)) { // 調用回調函數(shù)比較
memcpy(t, a+j, sizeof(t));
memcpy(a+j, a+j+1, sizeof(t));
memcpy(a+j+1, t, sizeof(t));
}
}
}
void show(const char* msg, person* p, int n) // 輸出數(shù)組
{
puts(msg);
int i;
for(i = 0; i n; ++i)
printf("%d\t%s\t%.2f\n", p[i].age, p[i].name, p[i].height);
putchar('\n');
}
int main()
{
person a[] = {
15, "lex", 153.5,
14, "jack", 155.8,
13, "liu", 144.8,
16, "king", 165.3,
15, "Ben", 159.7
};
show("origin:", a, 5);
sort(a, 5, sortOnAge); show("sort on age:", a, 5); // 以年齡排序
sort(a, 5, sortOnName); show("sort on name:", a, 5); // 以姓名排序
sort(a, 5, sortOnHeight); show("sort on height:", a, 5); // 以身高排序
}
可能你已經(jīng)看出來了,對于這個排序函數(shù),如果你不用回調的話,你可以使用以下幾種方式來等效
第一:寫三個sort函數(shù)
缺點:代碼冗余,復用性不高
第二:sort函數(shù)接受一個數(shù)字,用于定義常量判斷排序的依據(jù)
比如sort(person* a, int n, int cmpmode)
...
switch(cmpmode)
case SORT_ON_AGE: { cmp = a[i].age a[i+1].age }; break;
case SORT_ON_NAME: { cmp = a[i].name a[i+1].name }; break;
.....
if(cmp){ /*交換*/ }
缺點:這個方法比方法一要好,不過仍不夠靈活,而且同樣造成代碼冗余,缺乏復用性,有n種排序選擇就要寫n個cmp = a[i].xxx a[i+1].xxx
到這里你已經(jīng)看出回調函數(shù)的好處了吧。特別地,使用回調函數(shù)可以在一定程度上封裝調用函數(shù)的邏輯,這在寫庫和api的時候就很有用了,比如windows的n多api里都用到回調函數(shù),os來調用你提供的一個函數(shù)地址,這種情況你無論如何也不可能自己去實現(xiàn)那個調用api吧,所以回調函數(shù)作用多多
callback Function
回調函數(shù)是應用程序提供給Windows系統(tǒng)DLL或其它DLL調用的函數(shù),一般用于截獲消息、獲取系統(tǒng)信息或處理異步事件。應用程序把回調函數(shù)的地址指針告訴DLL,而DLL在適當?shù)臅r候會調用該函數(shù)。回調函數(shù)必須遵守事先規(guī)定好的參數(shù)格式和傳遞方式,否則DLL一調用它就會引起程序或系統(tǒng)的崩潰。通常情況下,回調函數(shù)采用標準WindowsAPI的調用方式,即__stdcall,當然,DLL編制者可以自己定義調用方式,但客戶程序也必須遵守相同的規(guī)定。在__stdcall方式下,函數(shù)的參數(shù)按從右到左的順序壓入堆棧,除了明確指明是指針或引用外,參數(shù)都按值傳遞,函數(shù)返回之前自己負責把參數(shù)從堆棧中彈出。
理解回調函數(shù)!
程序在調用一個函數(shù)(function)時(通常指api).相當于程序(program)呼叫(Call)了一個函數(shù)(function)關系表示如下:
call(調用)
program --------------------→ dll
程序在調用一個函數(shù)時,將自己的函數(shù)的地址作為參數(shù)傳遞給程序調用的函數(shù)時(那么這個自己的函數(shù)稱回調函數(shù)).需要回調函數(shù)的 DLL 函數(shù)往往是一些必須重復執(zhí)行某些操作的函數(shù).關系表示如下:
call(調用)
program --------------------→ dll
↑ ¦
¦_______________________________¦
callback(回調)
當你調用的函數(shù)在傳遞返回值給回調函數(shù)時,你就可以利用回調函數(shù)來處理或完成一定的操作。至于如何定義自己的回調函數(shù),跟具體使用的API函數(shù)有關,很多不同類別的回調函數(shù)有各種各樣的參數(shù),有關這些參數(shù)的描述一般在幫助中有說明回調函數(shù)的參數(shù)和返回值等.其實簡單說回調函數(shù)就是你所寫的函數(shù)滿足一定條件后,被DLL調用!
也有這樣的說法(比較容易理解):
回調函數(shù)就好像是一個中斷處理函數(shù),系統(tǒng)在符合你設定的條件時自動調用。為此,你需要做三件事:
1. 聲明;
2. 定義;
3. 設置觸發(fā)條件,就是在你的函數(shù)中把你的回調函數(shù)名稱轉化為地址作為一個參數(shù),以便于DLL調用。
C語言中函數(shù)指針與普通指針沒什么差別,只是指向的內容不同而已。主要作用:
1、實現(xiàn)面向對象編程中的多態(tài)性。
2、回調函數(shù)。
函數(shù)指針是指向函數(shù)的指針變量。 因此“函數(shù)指針”本身首先應是指針變量,只不過該指針變量指向函數(shù)。這正如用指針變量可指向整型變量、字符型、數(shù)組一樣,這里是指向函數(shù)。
C在編譯時,每一個函數(shù)都有一個入口地址,該入口地址就是函數(shù)指針所指向的地址。有了指向函數(shù)的指針變量后,可用該指針變量調用函數(shù),就如同用指針變量可引用其他類型變量一樣,在這些概念上是大體一致的。
函數(shù)指針有兩個用途:調用函數(shù)和做函數(shù)的參數(shù)。
函數(shù)指針實質是一個指針,該指針指向函數(shù)的入口地址,回調函數(shù)只不過是通過參數(shù)自己調用自己,首先它是一個函數(shù),跟函數(shù)指針完全沒有什么可比性,風馬牛不相及。
定義一個函數(shù)指針你看下:void (*func)(int ,int);
再給你看看比如:int *p; int max(int x,int y);
p=max;這里呢就是一個指針指針一個函數(shù),所以這個p也是一個函數(shù)指針,說白了它就只是一個指針,只是不過指向的是一個函數(shù)而已,就這么簡單。
就這樣調用就可以了int result=(*p)(a,b)
你們不要總是把函數(shù)指針和指針函數(shù)比來比去的,也沒有什么可比性,函數(shù)指針就只是一個指針,指針函數(shù)就只是一個函數(shù)就完了!
網(wǎng)頁名稱:c語言回調函數(shù)和函數(shù)指針,c語言回調函數(shù)和函數(shù)指針的關系
文章出自:http://chinadenli.net/article21/dsiiocd.html
成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供品牌網(wǎng)站建設、品牌網(wǎng)站制作、建站公司、網(wǎng)站維護、網(wǎng)站營銷、App設計
聲明:本網(wǎng)站發(fā)布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經(jīng)允許不得轉載,或轉載時需注明來源: 創(chuàng)新互聯(lián)