天天看點

C/C++ 函數指針函數指針栗子使用typedef函數指針作為參數傳遞給函數指向函數的指針數組指向類成員函數的函數指針

函數指針

函數是存放在記憶體的代碼區域内

栗子

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]();
}           

指向類成員函數的函數指針

由于虛函數是偏移量,是以取得的隻是一個索引,即在虛函數表的偏移位址

非虛函數,傳回的是在記憶體中的真實位址

普通函數指針儲存的是函數體開始的位址,即,代碼指針。

資料指針 用于儲存資料的指針

由于虛函數的存在,是以在在類的成員函數指針在調用的時候需要傳入類的執行個體化後的對象,用于找到虛函數在記憶體中的函數體開始的位址。

繼續閱讀