簡體   English   中英

指向C ++中的函數指針

[英]Pointer to function pointer in C++

我寫了一些代碼來了解函數指針是如何工作的。 我在某些IDE上運行以下C ++代碼,結果是一樣的。

#include "stdafx.h"

int *function(){
    static int a=1;
    return &a;
}
typedef struct{
    int *(*pt_1)();
    int *(*pt_2)();
}x_t;
int _tmain(int argc, _TCHAR* argv[])
{
    x_t s;
    s.pt_1 = function;
    s.pt_2 = &function;

    printf("%x\n",s.pt_1);    //Result: 0x013011a9
    printf("%x\n",*s.pt_1);   //Result: 0x013011a9 
    printf("%x\n",**s.pt_1);  //Result: 0x013011a9
    printf("%x\n",s.pt_1());  //Result: 0x01307000
    printf("%x\n",*s.pt_1()); //Result: 1

    printf("%x\n",s.pt_2);    //Result: 0x013011a9
    printf("%x\n",*s.pt_2);   //Result: 0x013011a9
    printf("%x\n",**s.pt_2);  //Result: 0x013011a9
    printf("%x\n",s.pt_2());  //Result: 0x01307000
    printf("%x\n",*s.pt_2()); //Result: 1

    return 0;
}

我的問題:

    1. 為什么s.pt_1 == s.pt_2 == *s.pt_1 = **s.pt_1
    1. s.pt_1()指向何處? 它在內存中的位置?

與使用數組的名稱類似,使用函數的名稱會使它在最輕微的激發時衰變為指針。

s.pt_1 = function;    

這里function衰減成指向函數的指針。

s.pt_2 = &function;

在這里,您實際獲取函數的地址,這將產生與第一種情況相同的指針。

printf("%x\n",s.pt_1);    //Result: 0x013011a9
printf("%x\n",*s.pt_1);   //Result: 0x013011a9 
printf("%x\n",**s.pt_1);  //Result: 0x013011a9

在第一行, pt_1是指向函數的指針,並顯示存儲在指針中的地址。

在第二行,您取消引用指針並訪問函數本身。 傳遞給函數時衰減成指針。

在第三行,您取消引用指針以獲取該函數,然后當您將其與另一個*一起使用時,該函數會衰減到指針。 第二個星形會產生一個值,該值在傳遞給函數時會再次衰減為指針。 等等。

問題是你基本上不能用“函數對象”做任何事情...... C ++只管理“指向函數的指針”。

因此,函數將隱式地衰減為指向函數的指針以供任何使用......無論你放在它前面有多少*都沒關系。

數組會發生類似的事情,它們會隱式地衰減成指向第一個元素的指針,不同之處在於你可以在數組上做一些操作(例如sizeof ),而這甚至是禁止使用函數。

鑒於在C ++中沒有(便攜式)方法在運行時創建新函數,不能操作函數對象的限制並不重要。 你只能處理指向現有函數的指針......

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM