Подтвердить что ты не робот

Арифметика указателей: ++ * ptr или * ptr ++?

Я изучаю C-язык и довольно путаю различия между ++*ptr и *ptr++.

Например:

int x = 19;
int *ptr = &x;

Я знаю, что ++*ptr и *ptr++ создают разные результаты, но я не уверен, почему это?

4b9b3361

Ответ 1

Эти инструкции дают разные результаты из-за того, как связываются операторы. В частности, префикс ++ имеет тот же приоритет, что и *, и они связывают права налево. Таким образом,

++*ptr

анализируется как

++(*ptr)

означает "увеличить значение, на которое указывает ptr,". С другой стороны, оператор postfix ++ имеет более высокий приоритет, чем оператор dereferrence *. Thefore

*ptr++

означает

*(ptr++)

что означает "оценить значение, указанное в настоящее время на ptr, и увеличить значение ptr" (порядок которого не указан).

В описанном вами контексте вы, вероятно, захотите написать ++*ptr, который будет косвенно увеличивать x через ptr. Написание *ptr++ было бы опасно, потому что он прошел бы ptr вперед x, а так как x не является частью массива, указатель будет болтаться где-то в памяти (возможно, поверх самого себя!)

Надеюсь, это поможет!

Ответ 2

Принятый ответ неверен. Это не тот случай, когда оператор postfix ++ имеет тот же приоритет, что и разыменование/коснутость *. Операторы префикса и постфикса имеют другой приоритет, и только префиксный оператор имеет тот же приоритет, что и разыменование/косвенность.

Как показывает таблица приоритетов

Ответ 3

Как говорит templatetypedef, но вы должны указать скобки вокруг *ptr, чтобы обеспечить результат. Например, следующие данные дают 1606415888, используя GCC и 0, используя CLang на моем компьютере:

int x = 19;
int *ptr = &x;
printf("%d\n", *ptr++);
printf("%d\n", *ptr);

И вы ожидали, что x будет равно 20. Поэтому используйте (*ptr)++.