C/C++ 函式指標
函式指標
函式是存放在記憶體的程式碼區域內
栗子
int test(int a){ return a; } int main(int argc, const char * argv[]){ // 這裡定義了一個引數為int型別的函式,函式的返回值為int型別的指標fp int (*fp)(int a); // 將test函式的地址賦值給指標fp,完成一個指向函式。該指標指向的函式的引數為int型別 fp = test; // 呼叫test函式,這裡返回的值為2 cout << fp(2) << endl; return 0; }
使用typedef
int test(int a){ return a; } int main(int argc, const char* argv[]){ // 定義一個指向函式的型別 typedef int (*fp)(int a); // 定義了一個指向函式型別的變數f fp f = test; // 進行呼叫 cout << f(2) << endl; return 0; }
函式指標作為引數傳遞給函式
int test(int a){ return a - 1; } // (*fun)(int) 定義了一個int型別返回值也為int型別的函式指標fun int test2(int (*fun)(int), int b){ // 這裡呼叫fun指標指向的函式,其傳入的引數為10 int c = fun(10) + b; } int main(int argc, const char * argv[]){ // 定義函式指標 typedef int (*fp)(int a); fp f = test; //呼叫test2的時候,由於指標f指向test函式的地址,將tets函式的地址作為引數傳遞給test2,然後tets2再次呼叫test並傳入值為10 cout << test2(f, 1) << endl; }
指向函式的指標陣列
void t1(){ cout << "test1" << endl; } void t2(){ cout << "test2" << endl; } void t3(){ cout << "test3" << endl; } int main(int argc, const char * argv[]){ // 定義一個引數為空的函式指標 typedef void (*fp)(void) // 定義一個指向函式的指標陣列 fp b[] = {t1, t2, t3}; // 這時通過陣列下標,間接的呼叫 b[0](); }
指向類成員函式的函式指標
由於虛擬函式是偏移量,所以取得的只是一個索引,即在虛擬函式表的偏移地址
非虛擬函式,返回的是在記憶體中的真實地址
普通函式指標儲存的是函式體開始的地址,即,程式碼指標。
資料指標 用於儲存資料的指標
由於虛擬函式的存在,所以在在類的成員函式指標在呼叫的時候需要傳入類的例項化後的物件,用於找到虛擬函式在記憶體中的函式體開始的地址。