2017-08-10 107 views
-1

我有一個簡單的指針試用版。C++:指向同一對象的兩個指針共享相同的地址?

k1和k2都是指針並指向j。

我以某種方式期望k1和k2是不同的。但另一方面,如果它們只是代表整數j的地址,它們應該是相同的。

任何人都可以告訴我k1和k2之間有什麼區別嗎?

int j=0, *k1=&j, *k2=&j; 
j=2; 
std::cout<<"k1 points to "<<*k1 << " and k2 points to "<<*k2 <<std::endl; 
std::cout<<" k1 is "<< k1 << " k2 is "<<k2<<std::endl; 
return 0; 

但結果顯示

k1 points to 2 and k2 points to 2 
k1 is 0x7fffffffd6fc k2 is 0x7fffffffd6fc 
+1

'std :: cout <<&k1'和'std :: cout <<&k2'會告訴你一些你似乎在尋找的區別。 –

+0

爲什麼從指針開始? 'int x = 42,y = 42;'x和y是否相同? –

回答

2

變量​​和k2的存儲本身是不同的。他們的(即它們指向的位置)是相同的。您可以通過簡單的賦值完成相同的:

int j = 0; 
int *k1, *k2; 

k1 = &j; // Make k1 point to the location of j 
k2 = k1; // Copy the value from k1 into k2, after this k2 also points to the location of j 

如果你想打印變量的位置​​和k2您需要使用地址的運營商&

std::cout << "k1 is located at "<< &k1 << ", and k2 is located at "<< &k2 << std::endl; 

在內存中,它可能可能看起來像這樣:

+-------------+ 
| variable j | <--+--\ 
+-------------+ | | 
| variable k1 | ---/ | 
+-------------+  | 
| variable k2 | ------/ 
+-------------+ 

也就是說,你有三個存儲位置。其中兩個值(​​和k2)的值是j的地址。

+0

好的謝謝你的解釋。當時間允許時, 將接受 – cxf54

1

你沒有打印的​​和k2地址。你打印出他們的價值。它們的值是的地址j

如果打印他們的地址,像這樣(注意號):

std::cout<<" k1 is "<< &k1 << " k2 is "<< &k2 << std::endl; 

這些將是不同的。

+0

我是一名hw工程師。所以從記憶的角度來看。我有三個條目。 A j B k1 C k2 因此k1和k2的值都是A,而您說B和C是不同的。對? – cxf54

+0

@ cxf54 - 正確。這正是我所說的。 – StoryTeller

相關問題