Вопрос по c – Инкрементный указатель (ptr ++) и (* ptr ++)

0

Я пересматривал указатели, когда у меня было это сомнение.

<code>int *ptr;
int arr[5] = {10,20,30,40,50};
ptr = &arr[0];
</code>

Сейчасprintf("Value: %d",*ptr); будет печатать10

если я сделаю:

<code>ptr++;
printf("Value: %d",*ptr);
</code>

результат будет:20

Точно так же, если я делаю:

<code>*ptr++;
printf("Value: %d",*ptr);
</code>

результат:30

Но

<code>printf("Value: %d",++*ptr);
</code>

дает мне31

Я думал сptr имеет типint когда я увеличиваю его, он переходит на 4 байта к следующей ячейке памяти. Но почему это показывает то же самое поведение для*ptr++ а такжеptr++ и не для++*ptr?

возможный дубликатwhy does *ptr++ act like *(ptr++) and not (*ptr)++? Oliver Charlesworth

Ваш Ответ

5   ответов
2

Первый фрагмент очевиден: он печатает, чтоptr указывает, то есть 10.

Второй перемещает указатель вперед на один элемент, который затем указывает на следующий элемент, то есть на 20.

Третий фрагмент точно такой же, как предыдущий, потому что его первая инструкция увеличивает указатель и возвращает неинкрементированное значение, которое разыменовывается, но его результат отбрасывается; что разыменовано вprintf это увеличенный указатель, который теперь указывает на 30.

Последний фрагмент отличается:++*ptr является++(*ptr); *ptr разыменовываетptr (который уже указывает на30), получая 30, и++ увеличивает такое значение, которое становится 31.

2

Когда вы делаете* ptr++вы на самом деле делаете* (ptr++)таким образом, указатель увеличивается, а не переменная, на которую он указывает

когда++ *ptrэто на самом деле++(* ptr), так что он увеличивает значение, возвращаемое указателем

5

precedence.

*ptr++ is the same as *(ptr++), the pointer is incremented, but its previous value is dereferenced. ptr++ is the same as, well, ptr++. ++*ptr is the same as ++(*ptr), i.e. it increments the thing being pointed to, not the pointer.
@noMAD: нет, потому что в*(ptr++), скобки означают, что++ применяется кptrне*ptr.
Когда я делаю*(ptr++) не следует разыменовывать значениеptr и увеличивать его, а не увеличивать указатель на следующую ячейку памяти? Разве это не то, что происходит с++(*ptr)? noMAD
1

()
++
* & for pointers
* /
+ -

так,

 *ptr++ equivlant to *(ptr++)
 ++*ptr equivlant to ++(*ptr)

и для этой строки * ptr ++; он будет только увеличивать указатель ptr.

0

что всякий раз, когда оба являются унарными операторами, ассоциативность происходит справа налево.

* ptr ++ - & gt; сначала увеличить указатель на следующее местоположение, а затем разыменовать значение в этом местоположении.

Аналогично * ++ ptr -> сначала указатель приращения, а затем разыменование.

++ * ptr - & gt; сначала значение разыменования в ptr, а затем увеличивайте значение.

Похожие вопросы