Как работает постинкрементный указатель? - PullRequest
0 голосов
/ 12 апреля 2020

Это мой код

#include <stdio.h>
int main(void)
{
  int i, myarr[] = {15,3,27};
  int *ptr=&myarr[1];

  printf("%d\n",*ptr++);
  printf("%d\n",++*ptr);

  ptr=myarr;

  for(i=0;i<3;i++)
    printf("%d", *(ptr+i));

  return 0;
}

В той части, где используется постинкрементный указатель, почему он не печатает 4, а 28?

вывод

3
28
15328

Ответы [ 2 ]

3 голосов
/ 12 апреля 2020

printf("%d\n",*ptr++); указывает на 3, читает 3, увеличивает указатель и возвращает 3 для печати. ​​

ptr теперь указывает на 27

printf("%d\n",++*ptr); точек до 27, увеличивает с 27 до 28 в массиве, возвращает 28 для печати. ptr без изменений.

0 голосов
/ 12 апреля 2020

В *ptr++, ++ имеет приоритет над *, поэтому выражение равно *(ptr++). Он принимает значение ptr, отдельно увеличивает ptr и использует значение до увеличения с *. Поскольку до приращения ptr указывает на 3, *ptr++ оценивается до 3. Приращение оставляет ptr, указывая на 27.

В ++*ptr, * должен применяться первым, поэтому выражение ++(*ptr). Тогда *ptr - это то, на что указывает ptr, то есть 27, и ++ увеличивает его и выдает значение после приращения. Таким образом, 27 изменяется на 28, а значение выражения составляет 28.

...