我发现了一个输出5的程序。我不知道怎么做。请解释一下。

int main(void) {
        int t[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }, *p = t;
        p += 2;
        p += p[-1];
        printf("\n%d",*p);
        return 0;
    }

我预计产量是4。
指针在这里从t[0]移动到t[2](p+=2;)。在下一个语句p+=p[-1]中,我相信指针会先移到t[1],t[1]的值是2,因此增加了2。所以我预计产量是4。
但实际产量是5。有人,请解释一下?

最佳答案

首先,指针指向数组的开头。所以应该是

p--
  |
  v
------------------------------------------
| 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 |
------------------------------------------

现在
p += 2

p是根据指针算法递增的。所以t现在指向p
p----------
          |
          v
------------------------------------------
| 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 |
------------------------------------------

p3相同。即,地址p[-1]处的值。这个值是*(p-1)
      ------ p[-1] or *(p-1)
      |
      |
------|-----------------------------------
| 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 |
------------------------------------------

p-1添加到2的当前值后,2现在将指向p
p------------------
                  |
                  v
------------------------------------------
| 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 |
------------------------------------------

因此,当您打印p的值时,5将被输出。

关于c - 以下程序输出为什么是5,而不是4?谁能解释?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/55810204/

10-11 21:48