int main()
{
int x = 30, *y, *z;
y = &x;
/* Assume address of x is 500 and integer is 4 byte size */
z = y;
*y++ = *z++;
x++;
printf("x=%d, y=%d, z=%d\n", x, y, z);
return 0;
}
以上是代码。
输出为:x=31, y=504, z=504
如果我错了,请纠正我:
据我所知:y=&x;
将x
的地址指定给y
。因此,y
现在保留500
的值。
z=y;
自y = 500
起,这会将500
分配给z
。
真正令我困惑的是这部分*y++=*z++;
,我不知道这意味着什么,因为有很多事情同时发生。 z
增加并指向某处(AND实际指向哪里?没有像y y=&x;
那样分配给它的地址。然后*y
也会同时增加(是你甚至允许这样做?)。
让我感到困惑的另一件事是:在我看来,由于y
指向x
,当y++
发生时,x
应该增加到31
},然后当代码块x++
发生故障时,x
现在应为32
。
所以,问题是,我们是如何获得x=31, y=504, z=504
的输出的?谢谢。
答案 0 :(得分:2)
让我们把它分解。
int x=30, *y, *z;
y,z
已定义且x
已初始化。y=&x; z=y;
两个指针都分配了地址x(即&x
)*y++=*z++;
这个包含了一些内容,所以我将其分开:postfix++
优先于indirection*
,因此我们可以将*y++
视为*(y++)
y++
表示y的值将增加1,而y
为int*
,它实际上会将sizeof(int)
添加到其值[在您的情况下为4] 。 但表达式y++
的值是y
之前增量的值,这会导致我们...... postfix++
之后,将评估间接,并且由于y++
的值是“旧”y
的值,因此您获得x
的值} 结论:y
增加1
但是间接(取消引用)导致我们x。
同样适用于z
。最终会发生两个y,z
递增,但之前 x中的值被分配给x(过时:) :)
接下来,您将x++;
将x
的值增加1.这就是它。
您可以将*y++=*z++;
视为:
*y = *z;
y++, z++;