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