Почему ++ (* ptr) увеличивает значение Pointer? - PullRequest
1 голос
/ 10 мая 2019

Так что я новичок в C и проверил некоторые вещи с указателями, и у меня есть вопрос по поводу следующего printf:

char txt[] = "thisIsAQuestion";
char *ptr = &txt[9];
printf("%c\n", ++(*ptr));
printf("%c\n", *ptr);

Итак, следуя моим «знаниям», это будет выглядеть примерно так:

Указатель указывает на значение «е». Затем, если я выполню первый printf, первым делом будет команда, которая находится в (), так что разыменование указателя * ptr, потому что оно имеет более высокий приоритет по сравнению с инкрементом префикса. Теперь я думаю, что ++ будет действовать как (* ptr + 1), потому что указатель уже разыменован, и увеличивает значение, на которое указывает указатель, но не меняет сам указатель. Так что это будет «е».

Но теперь, когда я запускаю второй printf, он показывает мне, что указатель по-прежнему указывает на «f» и не «возвращается» к «e».

Есть ли ошибка в моих мыслях? Или я что-то еще не учел?

Ответы [ 2 ]

0 голосов
/ 10 мая 2019

char *ptr = &txt[9]; указывает на txt, но начинается с символа e.

Оператор printf("%c\n", ++(*ptr)); вначале увеличивает e символ и печатает его как f (e+ 1 = f)

И оператор printf("%c\n", *ptr); просто печатает символ, на который указывает (и его f), потому что значение e изменилось с ++(*ptr).

0 голосов
/ 10 мая 2019

Вам не хватает того, что указатель указывает на адрес, префикс ++ оператор изменяет значение операнда.

++ будет действовать как (* ptr+ 1)

Нет, скорее это действует как *ptr = (*ptr + 1).

Итак, (*ptr) приводит к значению e, (как и ожидалось), а затем, с помощью ++, значение увеличивается и сохраняется в той же ячейке памяти.

  • Результатом оператора приращения префикса является новыйзначение, которое передается в качестве аргумента printf() - оно печатает это значение.

  • Для второго оператора printf() вы уже печатаете увеличенное значение.

Связано, цитирование C11, глава 6.5.3.1

Значение операнда префикса оператора ++ увеличивается на единицу.Результатом является новое значение операнда после увеличения.Выражение ++E эквивалентно (E+=1). [...]

...