Я изучаю C-язык и довольно путаю различия между ++*ptr и *ptr++.
Например:
int x = 19;
int *ptr = &x;
Я знаю, что ++*ptr и *ptr++ создают разные результаты, но я не уверен, почему это?
Ответ 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)++.