Почему следующая программа выводит 5, а не 4?Кто-нибудь может объяснить? - PullRequest
0 голосов
/ 23 апреля 2019

Я наткнулся на программу, которая выдает 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 ]

3 голосов
/ 23 апреля 2019
p = t; // p = &t[0]
p += 2; // p = &t[2]
p += p[-1]; // p += 2; // p = &t[4]
2 голосов
/ 23 апреля 2019

Сначала указатель 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...