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。
下面的评论解释了它是如何工作的:
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
为了简单起见,让我们说&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
当你这样做时:
p1=p2;
您基本上是将变量 k 的地址从 p2 复制到 p1 中。所以在那一步之后,两个指针都指向变量k,所以如果你取消引用p1或p2,你实际上会改变变量k的值而不是y。
当你这样做时:
*p1 = 3;
您将 3 分配给变量 k。那么当你这样做时:
*p2 = 4;
您再次将 4 分配给变量 k 。这就是为什么 y 保持不变,当你打印它时它给你 1。
该语句p1=p2;
设置p1
为指向变量k
。所以以下两个任务:
*p1=3;
*p2=4;
只影响 variable k
,所以y
仍然是 1。
当然,虽然我很想听听你是如何到达 4 的。p1 被分配了地址(即指向)y,但 2 行之后它被 k 的地址所取代。因此,p1 和 p2 都不指向 y,所以 y 不会改变。