2015-09-06 130 views
0

我試圖返回一個指針的使用下面的代碼的地址的地址:返回一個指針

#include <iostream> 
using namespace std; 

int main(){ 
    int x = 5; 
    int *p = &x; 
    //int **pp = &p; 
    cout << &p << endl; 
    return 0; 
} 

但是什麼會打印是0x28fea8,這是同一個地址爲x本身。現在,如果我取消上面唯一註釋行的註釋並保留其他所有內容,那麼打印的內容是0x28fea4,這似乎是指針的正確地址。

我的問題是爲什麼我需要未註釋的行來顯示指針的正確地址?

爲什麼 「COUT < < p < < ENDL」 和 「COUT < < & p < < ENDL」 既顯示0x28fea8如果該行被留下評論?

不應該 「COUT < < & p < < ENDL」 顯示0x28fea4不管其他線的?

如果有幫助,我使用Qt Creator作爲我的編譯器/ ide。我從以下鏈接下載我的編譯器:http://web.stanford.edu/~rawatson/qt/windows_install/index.html

編輯:好吧,我真是無聊。我的問題是我通過更改值來比較地址,然後重新運行該程序。相反,我應該通過在一次程序運行中將它們全部打印進行比較。當我在一個程序中進行比較時,我得到了不同的地址p和& p,因爲它應該是。

+1

你可以添加使用的編譯器標誌到你的文章?你的例子在Ubuntu上使用-O3的G ++ 4.8.4正常工作:當我打印p和打印&p時,我得到兩個不同的輸出。 – Cheiron

+1

'然而,打印出來的地址與x本身的地址相同。[False。](http://rextester.com/RZRVU60305)'p'和'&x'是相同的。 「&p」是不同的,因爲性質本來就是這樣。 –

+0

也許這是我的編譯器,我更新了我的帖子,並鏈接到了我下載的地方。 –

回答

2

我無法重現你是在告訴什麼,與this代碼:

#include <cstdio> 
using namespace std; 

int main() { 
    int x = 5; 
    int* p = &x; 

    printf("x address: %p\n", &x); 
    printf("p value: %p\n", p); 
    printf("p address: %p\n", &p); 

    return 0; 
} 

我得到以下輸出:

x address: 0xbfd6bba8 
p value: 0xbfd6bba8 
p address: 0xbfd6bbac 

這是正確的,確實是&p&x+4這是正確的在32位架構上,因爲它們被分配在堆棧上。

+0

雅我的問題在於我比較了我的程序的不同運行地址。爲了得到適當的比較,我應該像你一樣在一個程序運行中打印地址。 –

1
int x = 5; 
int *p = &x; // b stores addres of variabile a 

cout << "Adress of x is : " << p <<endl; // printing the adress of a 
cout << "Value of x is : " << *p << endl; // printing the variabile stores in a 

int **pp = &p; // pp stores thea adress of p 
cout <<"Adress of p is" << pp << endl; //printing the adress of p 
cout << "Adress of x is" <<*pp << endl; //printing the adress of x 
return 0; 

我希望評論能夠解決您的問題。