簡體   English   中英

為什么指針地址的輸出不同?

[英]why does output of an address of pointer is different?

我對程序退出感到困惑,請考慮我們有一個如下所示的類:

#ifndef SOMECLASS
#define SOMECLASS
class SomeClass
{
    public:
        SomeClass();
        SomeClass(int);
        ~SomeClass();
        void foo(const int&);
}
#endif

及其實現...

所以在主要功能上:

int main(int argc, char **argv){
    SomeClass* smc=new SomeClass();
    cout<<smc<<"--"<<&smc<<"--"<<&*smc; 
}

和我的輸出如下所示:

0xf66210----0x7ffd622a34f0----0xf66210

為什么smc和&smc和&* smc之間有區別? 請注意,smc和&* smc相等。

我正在使用ubuntu(14.04_x64)和+ cmake(2.18)+ gcc(4.8.4)

smc是指針smc的值,它是smc指向的地址。

&smc是指針smc本身的地址。

&*smcsmc指向的地址(指向的是*smc ),因此它與smc相同。

這里有兩個變量:
1.指針,它是堆棧分配的
2.對象,這是堆分配的

smc是存在於堆中的實際對象的地址。
因此, &*smc取消引用該地址,然后再次引用該地址,獲得相同的結果。 記住, *&就像是相反的運算符,例如加號和減號。 加上和減去相同的數量將獲得相同的結果,就像取消引用和再次引用一樣。

&smc是指針變量的地址,它位於堆棧上。

如果您仍然不清楚,請考慮以下示例:

int* x = nullptr;

x值是多少? &x什么?

現在?
x = new int(6)
x的新值是多少? 那是什么地址?

綜上所述,可以說:

  • smc顯示存儲在指針中的地址(使用new動態分配的( )內存的地址)

  • &smc顯示指針本身的地址

  • *smc顯示地址的內容(訪問class SomeClass的對象的成員)

  • &*smc指向相同的地址smc (指針的“別名”的,即相同的smc

多一點解釋。 因此,基本上smc是變量嗎? (一個指針,但仍然是一個變量)。 因此&smc為您提供了此變量地址

現在,如果您嘗試僅打印smc值,您應該得到什么? 變量的值正確嗎? 由於這是一個指針,因此在這種情況下,此變量的值是它指向的另一個對象的地址。

同樣, &*smc取消引用指針,並為您提供被取消引用對象的地址,該地址與上面的值相似。

暫無
暫無

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

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