C编程 - 指针(增量)

时间:2017-07-17 06:18:57

标签: c pointers increment

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的输出的?谢谢。

1 个答案:

答案 0 :(得分:2)

让我们把它分解。

  • int x=30, *y, *z; y,z已定义且x已初始化。
  • y=&x; z=y;两个指针都分配了地址x(即&x
  • *y++=*z++;这个包含了一些内容,所以我将其分开:
  1. 根据thispostfix++优先于indirection*,因此我们可以将*y++视为*(y++)
  2. y++表示y的值将增加1,而yint*,它实际上会将sizeof(int)添加到其值[在您的情况下为4] 。 表达式y++的值是y 之前增量的值,这会导致我们......
  3. 间接:在完成postfix++之后,将评估间接,并且由于y++的值是“旧”y的值,因此您获得x的值}
  4. 结论:y增加1但是间接(取消引用)导致我们x。

    同样适用于z。最终会发生两个y,z递增,但之前 x中的值被分配给x(过时:) :)

    接下来,您将x++;x的值增加1.这就是它。

    您可以将*y++=*z++;视为:

    1. *y = *z;
    2. y++, z++;