天天看點

函數指針與回調函數

一、函數指針

  1、  函數指針就是一個指針變量,用來指向函數位址。正在運作的程式(程序)在記憶體中占據一定的空間。程序包括編譯好的程式代碼和需要使用的變量。是以,程式代碼中的函數就是一些字元域,要得到一個函數位址,也就是得到這些字元域的起始位址。

    2、 函數指針的三種形式:

    指向普通c函數的函數指針        --- c語言中的函數指針

    指向c++類靜态成員函數的函數指針    --- c++

    指向C++類非靜态成員函數的函數指針   --- c++

    函數指針的本質自然也就是函數位址。  類成員函數的位址表示和普通C函數的位址是不一樣的。要表示一個類例的成員函數,光有函數位址還不夠,因為每個類執行個體擁有一個非靜态成員函數,而每個執行個體在記憶體中都要占據一定的空間,是以, 非靜态類成員函數的位址由兩部分組成,一 個是 執行個體位址,一個是 函數位址。執行個體位址通過隐含的this指針來傳遞。函數位址就是函數在執行個體所占記憶體中的偏移位址,隻不過這個位址通過函數名取得,并不需要關心其偏移具體的多少.

    靜态成員函數和 非靜态成員函數的差別:靜态成員函數并不是第個執行個體都擁有一個這樣的函數。是以,靜态成員函數的位址并不需要執行個體位址,也就是說,沒有this指針。其位址實質上和普通的c函數位址是一樣的,隻不過在定義函數指針時會有所不同。

   第一種和第三種的差別,兩者的差別:要得到一個類執行個體的成員函數指向非靜态成員函數的函數指針需要一個隐含參數:指向類執行個體的this指針。而指向普通C函數的函數指針隻需要得到函數位址既可。 這兩種類型的函數指針是不相容的(不可互相指派)。

3、函數指針的定義:

    指向普通函數的指針:

    int (*pfun)(float, char, char) = null;                       // c

    指向類成員函數的指針:

    int (myclass::*pmember)(float, char, char) = null;               // c++

    int (myclass::*pconstmember)(float, char,char) const = null;      // c++

    todo : 指向靜态成員函數的函數指針定義

二、回調函數

 1、回調函數就是一個通過函數指針調用的函數。如果把函數的指針(位址)作為參數傳遞給另一個函數,當這個指針被用為調用它所指向的函數時,我們就說這是回調函數。

 2、使用回調函數,需要:

聲明

定義

設定觸發條件:在你的函數種把你的回調函數名稱轉化為位址作為一個參數,以便于系統調用。

    注:聲明和定義時,回調函數由系統調用。

3、回調函數:一個程式員不能顯示調用的函數,通過将回調函數的位址傳給調用者進而實作調用。通過一個統一接口實作不同的内容。

繼續閱讀