任何人都可以向我解释这个意外的点输出吗?

时间:2013-11-05 16:12:43

标签: c pointers

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的指针,所以我不理解这个结果。

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

6 个答案:

答案 0 :(得分:2)

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

p = q;

p = &j;

这一行:

(*p) = (*q);

与:

相同
i = j;

所以,当你做:

i++;

与以下内容相同:

(*p)++;

这将导致您的输出:

8 9

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

答案 1 :(得分:1)

  

(*p) = (*q);

     

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

没有。您没有更改p的值;您已将p 指向的内容的值更改为。您已将值8(表达式*q的结果)赋给变量i

答案 2 :(得分:1)

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

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

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

间接运算符*的工作方式是,当您执行此操作(*p) = (*q)时,您必须为p指向的项指定{{1}指向的值}}。考虑到上面指针的配置,结果将与q完全相同。

现在情况发生了变化:

i = j

最后,您执行p -----> i (which is now equal to 8) q -----> j (which is still equal to 8) ,结果如下:

i++

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

答案 3 :(得分:0)

(*p) = (*q);

确定q指向p指向的内容,在这种情况下相当于:

i = j;

答案 4 :(得分:0)

p = q

将指针q指定给指针p。您的

(*p) = (*q)

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

答案 5 :(得分:0)

不,p没有指向q。

(* p)是指“p的含量”,所以如下:

(*p) = (*q) 

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