C語言中的回呼函數

來源:互聯網
上載者:User

回呼函數是一個程式員不能顯式調用的函數;通過將回呼函數的地址傳給調用者從而實現調用。回呼函數使用是必要的,在我們想通過一個統一介面實現不同
的內 容,這時用回掉函數非常合適。比如,我們為幾個不同的裝置分別寫了不同的顯示函數: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

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.