?回調(diào)函數(shù)是一個(gè)程序員不能顯式調(diào)用的函數(shù);通過將回調(diào)函數(shù)的地址傳給
調(diào)用者從而實(shí)現(xiàn)調(diào)用。回調(diào)函數(shù)使用是必要的,在我們想通過一個(gè)統(tǒng)一接口實(shí)現(xiàn)不
同的內(nèi)容,這時(shí)用回掉函數(shù)非常合適。比如,我們?yōu)閹讉€(gè)不同的設(shè)備分別寫了不同
的顯示函數(shù):void TVshow(); void ComputerShow(); void NoteBookShow()...等
等。這是我們想用一個(gè)統(tǒng)一的顯示函數(shù),我們這時(shí)就可以用回掉函數(shù)了。void sho
w(void (*ptr)()); 使用時(shí)根據(jù)所傳入的參數(shù)不同而調(diào)用不同的回調(diào)函數(shù)。
??????不同的編程語言可能有不同的語法,下面舉一個(gè)c語言中回調(diào)函數(shù)的例子,
其中一個(gè)回調(diào)函數(shù)不帶參數(shù),另一個(gè)回調(diào)函數(shù)帶參數(shù)。
??????例子1:
//Test.c
#include <stdlib.h>
#include <stdio.h>
int Test1()
{
??int i;
??for (i=0; i<30; i++)
??{
????printf("The %d th charactor is: %c\n", i, (char)('a' + i%26));
??}
??return 0;
}
int Test2(int num)
{
??int i;
??for (i=0; i<num; i++)
??{
???printf("The %d th charactor is: %c\n", i, (char)('a' + i%26));
??}
??return 0;
}
void Caller1(void (*ptr)())//指向函數(shù)的指針作函數(shù)參數(shù)
{
??(*ptr)();
}
void Caller2(int n, int (*ptr)())//指向函數(shù)的指針作函數(shù)參數(shù),這里第一個(gè)參數(shù)是為指向函數(shù)的指針服務(wù)的,
{ ??????????????????????????????????????????????//不能寫成void Caller2(int (*ptr)(int n)),這樣的定義語法錯(cuò)誤。
??(*ptr)(n);
??return;
}
int main()
{
??printf("************************\n");
??Caller1(Test1); //相當(dāng)于調(diào)用Test2();
??printf("&&&&&&************************\n");
??Caller2(30, Test2); //相當(dāng)于調(diào)用Test2(30);
??return 0;
}
??????以上通過將回調(diào)函數(shù)的地址傳給調(diào)用者從而實(shí)現(xiàn)調(diào)用,但是需要注意的是帶
參回調(diào)函數(shù)的用法。要實(shí)現(xiàn)回調(diào),必須首先定義函數(shù)指針。函數(shù)指針的定義這里稍
微提一下。比如:
????int (*ptr)(); 這里ptr是一個(gè)函數(shù)指針,其中(*ptr)的括號(hào)不能省略,因?yàn)?
括號(hào)的優(yōu)先級(jí)高于星號(hào),那樣就成了一個(gè)返回類型為整型的函數(shù)聲明了