2017-10-18 147 views
-2

考慮這個C++程序中的地址之間的C++:衝突指針的地址,並存儲在指針

#include<iostream> 
using namespace std; 

int main() { 
    int x = 7; 
    int *ip = &x; 
    cout << "the value of x is " << x <<endl; 
    cout << "the address of x is " << &x <<endl; 
    cout << "the address stored at ip is "<< ip <<endl; 
    return 0; 
} 

這是我得到的輸出:

the value of x is 7 
the address of x is 0x28ff08 
the address stored at the pointer is 0x28ff08 

這對我來說很有意義。但是,如果我的代碼更改爲以下,我得到不同的輸出:

#include<iostream> 
using namespace std; 

int main() { 
    int x = 7; 
    int *ip = &x; 
    cout << "the value of x is " << x <<endl; 
    cout << "the address of x is " << &x <<endl; 
    cout << "the address of the ip itself is "<< &ip <<endl; 
    return 0; 
} 

現在,我得到這樣的輸出:

the value of x is 7 
the address of x is 0x28ff0c 
the address of the ip itself is 0x28ff08 

在第一個代碼,地址變量x和存儲在指針ip處的地址是相同的,這對我很有意義。但在第二個程序中,ip本身的地址保持不變,但地址x似乎正在改變,這讓我感到困惑。我期望變量x的地址與第一個程序中的地址和指針的地址保持不變。

有人可以解釋這裏發生了什麼嗎?

+6

a)你爲什麼期望這樣做?b)你爲什麼會在意開始? –

+1

我真的不明白問題所在。你可以在問題中包含輸出,而不僅僅是截圖,也可以突出顯示你期望的相同/不同的地址? – user463035818

+1

您是否期望第二個片段中'x'的地址與第一個片段中'x'的地址相同?如果是,爲什麼?當你運行相同的代碼兩次時,你甚至不能指望'x'被存儲在同一個內存中 – user463035818

回答

1

第一個代碼中的值是相同的,因爲ip的值是x的地址(同一件事,ip保留x的地址)。但在第二個代碼中,結果是不同的,因爲x的地址不是ip的地址(ip是不同的變量 - 能夠保存其他變量的地址的指針)。計算機將決定創建它們 - 誰知道。我認爲這只是巧合,其中一個變量是在相同地址上創建的,另一個是在不同的地址上創建的

1

我想你可能會在指針的值,指針的地址,指針的值和指針的地址之間混淆。我認爲這可能是最好的解釋通過一張照片。如果你寫

int x = 7; 
int* ip = &x; 

然後,在內存中,事情是這個樣子:

+-----------+     +-----------+ 
    |  7  | <------------ | Address A | 
    +-----------+     +-----------+ 
     int x      int* ip 
    Address A      Address B 

這裏,變量x存儲在某個位置(稱之爲A),並將其持有的價值7。變量ip存儲在某個位置(稱爲B),並且其值爲地址A。請注意,AB必須互不相同,因爲xip佔據單獨的存儲位置。

現在,想想當你寫

cout << x << endl; 

這將打印出存儲在x的價值,這是7會發生什麼。 (我認爲這不是很奇怪。)

如果你寫

cout << &x << endl; 

要打印的是x坐在地址。無論A的價值如何,它都會隨着程序運行到程序運行而變化。

如果你寫

cout << ip << endl; 

要打印出存儲在ip值。由於ip指向x,存儲在ip中的值是x的地址,A恰好是。

但是,如果你寫

cout << &ip << endl; 

要打印出ip變量的地址。該地址在上面用B表示,並且取決於程序的特定運行。請注意,AB而不是是同樣的事情,所以你應該期望在這裏看到不同的值。

要回顧一下:

+-----------+     +-----------+ 
    |  7  | <------------ | Address A | 
    +-----------+     +-----------+ 
     int x      int* ip 
    Address A      Address B 

     cout << x << endl; // Prints 7, the contents of x. 
     cout << &x << endl; // Prints A, the address of x. 
     cout << ip << endl; // Prints A, the contents of ip. 
     cout << &ip << endl; // Prints B, the address of ip. 

在你的情況,好像Ax地址,是0x28ff0cipB)地址是0x28ff08。這並不意味着x的地址發生了變化,而是表明ipx佔用不同的內存地址。