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的指针,所以我不理解这个结果。
编辑:谢谢你们所有人。所有的解释对我来说都很有意义。
答案 0 :(得分:2)
不,如果你想让指针p
指向q
,你需要这样做:
p = q;
或
p = &j;
这一行:
(*p) = (*q);
与:
相同i = j;
所以,当你做:
i++;
与以下内容相同:
(*p)++;
这将导致您的输出:
8 9
因为p
仍然指向i
(p = &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仍然指向两个不同的记忆位置。