![](/img/trans.png)
[英]C++: Why does my function return a reference address different from the dereferenced pointer's address?
[英]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
本身的地址。
&*smc
是smc
指向的地址(指向的是*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.