天天看點

老碼識途 函數指針

調用函數需要函數的參數表,傳回類型,調用慣例 這三點合在一起就是函數原型;

一個函數指針包含函數的入口位址和函數原型兩個方面;

例如 int add(int a,int b) 定義一個函數指針:int (* P) (int ,int);(調用慣例預設是c方式,若不是則要标出,如int (_stdcall* P) (int ,int));

使用時:P=add 或 p=&add;

C語言指針類型包含兩方面資訊,一是位址,存放在指針變量中;二是類型資訊,關乎讀寫長度,沒有存儲在指針變量中,位于用該指針讀寫時的move指令中,不同的讀寫長度對應的mov指令不同。

關于函數指針的類型強制類型轉換:與資料指針一樣,函數指針在轉換指派的時候,除了指派位址沒有多餘的動作。起效時是在調用函數的時候,編譯器會按其原型産生不同的代碼。

類中函數指針和普通的函數指針形式一樣,但調用慣例和參數實際上是不一樣的:

typedef void (p)(A); //調用慣例是_cdecl

typedef void(A::P)(A);//調用慣例是_thiscall,形參中還有隐藏形參this指針

繼續閱讀