Ответ 1
Эти инструкции дают разные результаты из-за того, как связываются операторы. В частности, префикс ++
имеет тот же приоритет, что и *
, и они связывают права налево. Таким образом,
++*ptr
анализируется как
++(*ptr)
означает "увеличить значение, на которое указывает ptr
,". С другой стороны, оператор postfix ++
имеет более высокий приоритет, чем оператор dereferrence *
. Thefore
*ptr++
означает
*(ptr++)
что означает "оценить значение, указанное в настоящее время на ptr
, и увеличить значение ptr
" (порядок которого не указан).
В описанном вами контексте вы, вероятно, захотите написать ++*ptr
, который будет косвенно увеличивать x
через ptr
. Написание *ptr++
было бы опасно, потому что он прошел бы ptr
вперед x
, а так как x
не является частью массива, указатель будет болтаться где-то в памяти (возможно, поверх самого себя!)
Надеюсь, это поможет!