http://www.blogjava.net/huyi2006/articles/180169.html
回呼函數是一個程式員不能顯式調用的函數;通過將回呼函數的地址傳給
調用者從而實現調用。回呼函數使用是必要的,在我們想通過一個統一介面實現不
同的內容,這時用回掉函數非常合適。比如,我們為幾個不同的裝置分別寫了不同
的顯示函數:void TVshow(); void
ComputerShow(); void NoteBookShow()...等
等。這是我們想用一個統一的顯示函數,我們這時就可以用回掉函數了。void
sho
w(void (*ptr)()); 使用時根據所傳入的參數不同而調用不同的回呼函數。
不同的程式設計語言可能有不同的文法,下面舉一個c語言中回呼函數的例子,
其中一個回呼函數不帶參數,另一個回呼函數帶參數。
例子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)())//指向函數的指標作函數參數
{
(*ptr)();
}
void
Caller2(int n, int (*ptr)())//指向函數的指標作函數參數,這裡第一個參數是為指向函數的指標服務的,
{
//不能寫成void Caller2(int (*ptr)(int
n)),這樣的定義語法錯誤。
(*ptr)(n);
return;
}
int main()
{
printf("************************\n");
Caller1(Test1);
//相當於調用Test2();
printf("&&&&&&************************\n");
Caller2(30, Test2); //相當於調用Test2(30);
return 0;
}
以上通過將回呼函數的地址傳給調用者從而實現調用,但是需要注意的是帶
參回呼函數的用法。要實現回調,必須首先定義函數指標。函數指標的定義這裡稍
微提一下。比如:
int (*ptr)();
這裡ptr是一個函數指標,其中(*ptr)的括弧不能省略,因為
括弧的優先順序高於星號,那樣就成了一個傳回型別為整型的函式宣告了