一、函數指針
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、回調函數:一個程序員不能顯示調用的函數,通過將回調函數的地址傳給調用者從而實現調用。通過一個統一接口實現不同的內容。