2015-07-19 38 views
-3

此代码取自cplusplus.com。它在教程中用来解释指针,我正在努力理解。理解教程指针的问题

当他们写p1 = 20;在代码结束时,不会改变第一个值的存储器地址以及第二个值吗?因为他们以前在代码中已经创建了p1 = p2。

如果有人有不同的解释方式,除了他们从网站或其他教程的评论?

谢谢!

#include <iostream> 
using namespace std; 

int main() 
{ 
    int firstvalue = 5, secondvalue = 15; 
    int * p1, * p2; 

    p1 = &firstvalue; // p1 = address of firstvalue 
    p2 = &secondvalue; // p2 = address of secondvalue 
    *p1 = 10;   // value pointed to by p1 = 10 
    *p2 = *p1;   // value pointed to by p2 = value pointed to by p1 
    p1 = p2;   // p1 = p2 (value of pointer is copied) 
    *p1 = 20;   // value pointed to by p1 = 20 

    cout << "firstvalue is " << firstvalue << '\n'; 
    cout << "secondvalue is " << secondvalue << '\n'; 
} 

来自 “http://www.cplusplus.com/doc/tutorial/pointers/

+2

你应该从C++书中学习,而不是在互联网上随意的“tuts”。 –

+2

这里没有看到任何函数'front()'和'priority_queue'。 –

+0

代码中的优先级队列在哪里?哪个“前”不起作用?顺便说一句:引用他人或他们的代码时,你也可以包含一个链接到他们的工作。 –

回答

4

图表可能很容易解释了。

int firstvalue = 5, secondvalue = 15; 

这意味着,在某处存储,创建了两个int对象:

+------------+ +-------------+ 
|  5  | |  15  | 
+------------+ +-------------+ 
int * p1, * p2; 

    p1 = &firstvalue; // p1 = address of firstvalue 
    p2 = &secondvalue; // p2 = address of secondvalue 

这意味着,产生两个指针对象。他们的值使得它们指向两个int对象:

+------------+ +-------------+ 
|  5  | |  15  | 
+------------+ +-------------+ 
    ^    ^
     |     | 
    +----+   +----+ 
    | p1 |   | p2 | 
    +----+   +----+ 
*p1 = 10;   // value pointed to by p1 = 10 

这意味着该对象指向p1,即第一int对象,修改:

+------------+ +-------------+ 
|  10  | |  15  | 
+------------+ +-------------+ 
    ^    ^
     |     | 
    +----+   +----+ 
    | p1 |   | p2 | 
    +----+   +----+ 
*p2 = *p1;   // value pointed to by p2 = value pointed to by p1 

int对象指向p2应当被设置为相同的值作为一个指向p1

+------------+ +-------------+ 
|  10  | |  10  | 
+------------+ +-------------+ 
    ^    ^
     |     | 
    +----+   +----+ 
    | p1 |   | p2 | 
    +----+   +----+ 
p1 = p2;   // p1 = p2 (value of pointer is copied) 

在此行之后,没有任何东西指向第一个对象int了。 p1指向相同的对象p2

+------------+  +-------------+ 
|  10  | +-> |  10  | 
+------------+ | +-------------+ 
       |  ^
       |   | 
    +----+  |  +----+ 
    | p1 |------+  | p2 | 
    +----+    +----+ 
*p1 = 20;   // value pointed to by p1 = 20 

目的指向p1(这恰好是相同的一个由p2指出)被设定为20:

+------------+  +-------------+ 
|  10  | +-> |  20  | 
+------------+ | +-------------+ 
       |  ^
       |   | 
    +----+  |  +----+ 
    | p1 |------+  | p2 | 
    +----+    +----+ 

在这里,我们走了。第一个int是10,第二个是20.

+0

该图很有帮助,这是清楚解释,谢谢! – 17DOWN

1

当他们写出p1 = 20;在代码结束时,不会改变第一个值的存储器地址以及第二个值吗?因为他们以前在代码中已经创建了p1 = p2。

实际上他们写了*p1 = 20,但这就是为什么你是对的,是的。

如果你困惑,因为该程序仍发出两种不同的价值观,以及那是因为你打印firstvaluesecondvalue(这仍然是不同的),而不是*p1*p2(这两者都是secondvalue由点)。

你没有解释为什么这会让你感到困惑,或者你的问题是什么,或者这与priority_queue有什么关系,所以这就是我所能告诉你的。

+0

我不明白为什么他们不只是指向相同的价值和打印相同的价值。 – 17DOWN

+1

@ 17DOWN:[他们会,如果你真的打印他们](http://coliru.stacked-crooked.com/a/67cacf312421ee42)。但在你的例子中,你不是通过指针来打印的。 –

0

我给意见的理解

#include <iostream> 
using namespace std; 

int main() 
{ 
    int firstvalue = 5, secondvalue = 15; 
    int * p1, * p2; 

    p1 = &firstvalue; // *p1 = 5, since p1 is pointing to firstvalue 
    p2 = &secondvalue; // *p2 = 15, since p2 is pointing to secondvalue 
    *p1 = 10;   // *p1=10, changing firstvalue to 10 
    *p2 = *p1;   // now *p2=10; 
    p1 = p2;   // p1 is now pointing to secondvalue whose value is already changed into 10 by *p2=*p1; statement. 
    *p1 = 20;   // now secondvalue=20 since p1 is pointing to second value 

    cout << "firstvalue is " << firstvalue << '\n'; //prints 10 
    cout << "secondvalue is " << secondvalue << '\n'; //prints 20 
} 
+0

你所做的是使代码无效。 –

+0

@LightnessRacesinOrbit这是一个错字,更正了 – InQusitive

+0

@LightnessRacesinOrbit如果你认为它已被纠正,我可以返回我的+ ve。 – InQusitive