2017-08-10 146 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

相关问题