2017-04-01 145 views
-1

任何人都可以解釋我爲什麼& p分配內存後有相同的地址。 爲什麼p不具有相同的地址:& p?指針和參考地址

#include <iostream> 

using namespace std; 

int main() 
{ 
    int *p; 

    cout << "p value: " << *p << " p adress: " << p << " &p reference: " << &p; 

    p = new int; 
    *p = 5; 
    cout << endl; 
    cout << "p value: " << *p << " p adress: " << p << " &p reference: " << &p; 

    return 0; 

} 

編譯後:

p value: -462058557 p adress: 0x74af73da &p reference: 0x6fff0c 
p value: 5   p adress: 0x1d2978 &p reference: 0x6fff0c 
+0

'p'是指針指向的地址,'&p'是存儲指針的內存中的實際地址 – UnholySheep

+0

'&p'不是引用,它是指向'p'的指針。 – melpomene

+0

'&p'是一個'int **',不是一個引用,而'p'是一個'int *'。 「指針的地址與指針相同」magic [只發生在數組中](http://stackoverflow.com/questions/8412694/address-of-array)。 – dhke

回答

1

任何人都可以解釋我爲什麼& p的地址後,我分配的內存。

您無法獲取尚未分配內存的對象的地址。指針在塊作用域的開始處分配。因此,在分配之前,您從未觀察到指針的地址 - 僅在之後。

在分配動態內存之前,您確實獲取了指針的地址。分配動態內存後,您可以指定指針的值以獲取動態內存的地址。賦值變量對變量的存儲位置沒有影響。預計將保持在同一地址。


爲什麼p還沒有相同的地址爲:& P'

您從未觀察到&p的地址。實際上,&p是一個臨時的,所以它沒有地址。

<< &p給出的值爲&p,即地址p<< p爲您提供了值p,即第一次是不確定的值,第二次是動態分配的整數的地址。

也許你打算問「爲什麼p不具有相同的作爲&p」。這是因爲p不是指向自身,而是指向另一個對象。


此外,讀取不確定的值具有未定義的行爲。您的程序讀取p,並在爲其分配值之前將其解除引用。因此你的程序的行爲是不確定的。


參考地址

你的程序不使用的引用。


什麼是參考呢?

引用是一種類似於指針的類型。它更簡單,更受限制:它不能爲空,它不能被重新分配,並且它的地址不能被佔用。無論何時使用引用變量,它都是隱含的間接引用,與必須明確解除引用的指針不同。例如:

int i;  // non reference, non pointer 
int* p = &i; // a pointer 
int& r = i; // a reference 

p = nullptr; // a pointer can be null (doesn't point to anything) 
       // and it can be reassigned 
//r = nullptr; // a reference can not. This is ill-formed 
r = 42;  // a reference is implicitly indirected 
*p = 42;  // a pointer must be dereferenced explicitly 
       // to acces the pointed object 


int** pp = &p; // you can take the address of a pointer 
//int*& pr = &r; // you cannot take the address of a reference 
p = &r;   // if you apply address-of operator on a reference, 
       // it is indirected implicitly 
+0

那麼什麼是參考?我想清楚地知道...我有點困惑... – Marius

+0

@Marius看到編輯 – user2079303

0

&p包含p地址。

p包含值的地址;當您重新分配時,這可能會改變。

*p取消引用地址並讀取/寫入值。

除了你的代碼不正確;它可能會編譯。

0

變量p包含一個指向整數的指針,即p的值是一個指針,當你指定p = new int時該值會改變;

&p,相反,意味着存儲該指針值的存儲器地址p。地址&p最有可能位於堆棧上,並且如果您將某些內容分配給p,則此地址不會更改。

還請注意,您的第一個cout-序列是指未初始化的變量,這是未定義的行爲。