以下程序输出为什么是5,而不是4?谁能解释?

时间:2019-04-23 11:29:39

标签: c arrays pointers

我遇到了一个输出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],其值首先为2,因此增加2。因此,我希望输出为4。 但实际输出为5。有人解释吗?

2 个答案:

答案 0 :(得分:3)

<%@ page trimDirectiveWhitespaces="true" %>

答案 1 :(得分:2)

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

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

现在通过

p += 2

p是根据指针算法增加的值。这样p现在指向3

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

p[-1]*(p-1)相同。即,地址p-1上的值。此值为2

      ------ p[-1] or *(p-1)
      |
      |
------|-----------------------------------
| 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 |
------------------------------------------

2添加到p的当前值之后,p现在将指向5

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

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