C語言中的回調函數調用過程以及函數指針使用


回調函數比喻:

你到一個商店買東西,剛好你要的東西沒有貨,於是你在店員那里留下了你的電話,過了幾天店里有貨了,店員就打了你的電話,然后你接到電話后就到店里去取了貨。

在這個例子里,你的電話號碼就叫回調函數,你把電話留給店員就叫登記回調函數,店里后來有貨了叫做觸發了回調關聯的事件,店員給你打電話叫做調用回調函數,你到店里去取貨叫做響應回調事件。

回調函數是一個程序員不能顯式調用的函數;通過將回調函數的地址傳給調用者從而實現調用。

回調函數使用是必要的,在我們想通過一個統一接口實現不同的內容,這時用回掉函數非常合適。

比如,我們為幾個不同的設備分別寫了不同的顯示函數:

void TVshow(); void ComputerShow(); void NoteBookShow()...等等。

這是我們想用一個統一的顯示函數,我們這時就可以用回掉函數了。void show(void (*ptr)()); 使用時根據所傳入的參數不同而調用不同的回調函數。

不同的編程語言可能有不同的語法,下面舉一個c語言中回調函數的例子, 其中一個回調函數不帶參數,另一個回調函數帶參數。

// Test.c

#include <stdlib.h>
#include <stdio.h>

int Test1()
{
        int i;
        for (i=0; i<30; i++) {
                printf("The %dth 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 %dth charactor is:%c\n", i, (char)('a'+i%26));
        }

        return 0;
}

void Caller1( int (*ptr)() )              //指向函數的指針作函數參數 
{
        (*ptr)();
}

void Caller2(int n, int (*ptr)(int) )        //指向函數的指針作函數參數,這里第一個參數是為指向函數的指針服務的, 
{                                         //不能寫成void Caller2(int (*ptr)(int n)),這樣的定義語法錯誤。

        (*ptr)(n);
}

int main()
{
        printf("***************************\n");
        Caller1(Test1); //相當於調用Test1(); 
        printf("&&&&&&&**********************\n");
        Caller2(5, Test2);//相當於調用Test2(5);
        return 0;
}


以上通過將回調函數的地址傳給調用者從而實現調用,但是需要注意的是帶參回調函數的用法。

要實現回調,必須首先定義函數指針。函數指針的定義這里稍 微提一下。比如:

int (*ptr)(); 

這里ptr是一個函數指針,其中(*ptr)的括號不能省略,因為括號的優先級高於星號,那樣就成了一個返回類型為指向整型的指針類型的函數聲明了。

參考鏈接
http://www.zhihu.com/question/19801131/answer/13005983

http://www.blogjava.net/huyi2006/articles/180169.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM