3
int y=1;
int k=2; 
int *p1; 
int *p2; 
p1=&y;
p2=&k;
p1=p2;
*p1=3;
*p2=4;
printf("%d",y);

我得到的输出为 1,有人能解释一下为什么吗?我期待它是4。

4

5 回答 5

4

下面的评论解释了它是如何工作的:

int y=1;
int k=2; 
int *p1; 
int *p2; 
p1=&y; //pointer p1 holds the address of y
p2=&k; //pointer p2 holds the address of k
p1=p2; //pointer p1 now holds the address which p2 holds, which is the address of k
*p1=3; //the value which p1 points to is now 3 (so k equals 3 as well)
*p2=4; //the value which p2 points to is now 4 (so k equals 4 as well)
printf("%d",y); //y is still 1

但是,如果您这样做printf("%d",k);,将打印值 4

于 2013-07-05T20:50:20.843 回答
2

为了简单起见,让我们说&y=3&k=4

int y=1;
int k=2; 
int *p1; 
int *p2; 
p1=&y;  // p1=3
p2=&k;  // p2=4
p1=p2;  // p1=4
*p1=3;  // p1=4 so k becomes 3
*p2=4;  // p2=4 so k becomes 4
printf("%d",y); // we get 1 because y was never changed
于 2013-07-05T20:44:09.980 回答
1

当你这样做时:

p1=p2;

您基本上是将变量 k 的地址从 p2 复制到 p1 中。所以在那一步之后,两个指针都指向变量k,所以如果你取消引用p1或p2,你实际上会改变变量k的值而不是y。

当你这样做时:

*p1 = 3;

您将 3 分配给变量 k。那么当你这样做时:

*p2 = 4;

您再次将 4 分配给变量 k 。这就是为什么 y 保持不变,当你打印它时它给你 1。

于 2013-07-05T20:42:58.697 回答
1

该语句p1=p2;设置p1为指向变量k。所以以下两个任务:

*p1=3;  
*p2=4;

只影响 variable k,所以y仍然是 1。

于 2013-07-05T20:45:41.770 回答
0

当然,虽然我很想听听你是如何到达 4 的。p1 被分配了地址(即指向)y,但 2 行之后它被 k 的地址所取代。因此,p1 和 p2 都不指向 y,所以 y 不会改变。

于 2013-07-05T20:43:37.437 回答