【问题标题】:C Programming - Pointers (with increments)C 编程 - 指针(带增量)
【发布时间】:2017-12-21 13:46:30
【问题描述】:
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 被递增并指向某个地方(它实际上指向哪里?没有像 y 即 y=&x; 那样分配给它的地址。然后*y 也同时递增(你甚至允许这样做吗? ?)。

让我感到困惑的另一件事是:在我看来,由于y 指向x,当y++ 发生时,x 应该递增到31,然后在向下代码块时x++ 发生,x 现在应该是 32

那么,问题是,我们如何得到x=31, y=504, z=504 的输出?谢谢你。

【问题讨论】:

  • printf("x=%d, y=%d, z=%d\n", x, y, z); 是未定义的行为。如果你必须这样做,请使用%p 来打印指针。
  • @Evert 是的,这是为了锻炼。我正在尝试理解输出。
  • @JosefHoppe 来自 UB。
  • @AjayBrahmakshatriya 如printf("x=%d, y=%p, z=%p\n", x, y, z); ?

标签: c pointers increment


【解决方案1】:

让我们分解一下。

  • 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. indirection:在postfix++ 完成后,评估间接性,因为y++ 的值是“旧”y 的值,所以你得到x 的值

结论:y 增加了1,但间接(取消引用)将我们引向 x。

这同样适用于z。最终发生的情况是 y,z 都增加了,但是 x 中的值被分配给 x 之前(已过时:))

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

你可以把*y++=*z++;想象成:

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

【讨论】:

  • 假定值为 500,因为这是一个练习。 /* Assume address of x is 500 and integer is 4 byte size */
  • @WCKennedays,你的意思是*++y?那么它是UB,因为指针y+1不一定有效。
  • @WCKennedays 那么你的意思是++*y = ++*z?这又是 UB,因为您在 2 个序列点之间两次写入同一个指针。
  • C11 Standard (draft n1570)§ 6.5 (2) of Expressions 是您的参考
  • @CIsForCookies '因为 postfix++ 优先于 *' 它没有 - 取 *p 的第一个值,然后 p 递增,这样你就可以:while(*p) putch(*p++);
猜你喜欢
  • 1970-01-01
  • 2013-11-02
  • 2015-08-03
  • 2018-07-28
  • 2022-01-17
  • 2020-03-11
  • 2010-09-23
  • 2017-01-05
  • 1970-01-01
相关资源
最近更新 更多