0
int i = 2;
int j = 8;
int *p = &i;
int *q = &j;

所以此时很明显p指向2,q指向8。

(*p) = (*q);

现在指针 p 指向 q,而 q 又指向 j。j = 8 所以 p 应该指向值 8。最后一部分是:

i++;
printf("%d %d\n", *p, *q);

其输出是 9 8。但是,我不明白这一点,因为 p 指向 q,所以指针 p 是否应该不受此更改的影响,因为它指向 8?为什么 8 加 1?p 最初指向 i,但它改变了指向 q 的指针,所以我不明白这个结果。

编辑:谢谢大家。你所有的解释对我来说都很有意义。

4

6 回答 6

2

不,如果你想让指针p指向q,你需要这样做:

p = q;

或者

p = &j;

这一行:

(*p) = (*q);

是相同的:

i = j;

所以,当你做:

i++;

这与以下内容相同:

(*p)++;

这将导致您的输出:

8 9

因为p仍然指向i( p = &i) 和 ( q = &j)i = 9j = 8

于 2013-11-05T16:16:01.637 回答
1

(*p) = (*q);

现在指针 p 指向 q,而 q 又指向 j。

不。您没有更改 ; 的值p。您已经更改了p 指向的值。您已将值 8(表达式的结果*q)分配给变量i

于 2013-11-05T16:16:12.780 回答
0
(*p) = (*q);

assings what qpoints to what ppoints to,在这种情况下相当于:

i = j;
于 2013-11-05T16:15:55.443 回答
0
p = q

将指针分配q给指针p。您的

(*p) = (*q)

取出一个q指向的值,并将其存储到指向的位置p- 它们现在都指向一个8,但不同的8。然后你增加其中一个;另一个不受影响。

于 2013-11-05T16:16:25.797 回答
0

您误解了间接运算符的*工作方式。

这是发生的事情:指针到值的映射是这样开始的:

p -----> i (which is equal to 2)
q -----> j (which is equal to 8)

间接操作符*的工作方式是,当您执行此操作时(*p) = (*q),您说p必须为 by 指向的项目分配由指向的值q。考虑到上述指针的配置,结果将与您所做的完全相同i = j

现在情况变化如下:

p -----> i (which is now equal to 8)
q -----> j (which is still equal to 8)

最后,您执行i++,结果如下:

p -----> i (which is now equal to 9)
q -----> j (which is still equal to 8)

这就是打印 8 和 9 的原因。

于 2013-11-05T16:18:00.367 回答
0

不,p 不指向 q。

(*p) 指的是“p的内容”,所以如下:

(*p) = (*q) 

将 q 的内容复制到 p 的内容中,但 p 和 q 将保持不变;p 和 q 仍将指向两个不同的内存位置。

于 2013-11-05T16:18:22.193 回答