В чем разница между выражениями *p++ и p++?

Какой будет вывод в результате выполнения следующего кода на C++: 

```cpp
char buf[] = "123456";
char *p = buf;

*p++; или p++;

cout << p;
```

Обратите внимание на то, что под альтернативами `*p++` и `p++` подразумевается разное поведение указателя `p`.
  • 1 марта 2025 г. 16:44
Ответы на вопрос 2
В C++ выражения `*p++` и `p++` действительно имеют разное поведение, и это связано с правилами работы с указателями и операторами.

1. **`*p++`**: Это выражение подразумевает, что сначала будет разыменован указатель `p`, а затем указатель будет инкрементирован. То есть `*p++` сначала возвращает значение, на которое указывает `p`, и только после этого перемещает указатель на следующий элемент (в данном случае на следующий символ в строке). 
2. **`p++`**: Это выражение просто инкрементирует указатель `p`, не разыменовывая его. То есть `p++` перемещает указатель на следующий элемент, но не возвращает значение, на которое он указывает.

Теперь рассмотрим ваш код:

```cpp
char buf[] = "123456";
char *p = buf;

*p++; // это эквивалентно *(p++), что означает взять значение, на которое указывает p (то есть '1') и потом инкрементировать p на 1 (передвинуть его к '2').

cout << p; // теперь p указывает на '2'
```

При выполнении кода `cout << p;` указатель `p` будет указывать на второй элемент массива `buf`, который равен `'2'`. Таким образом, вывод будет:

```
23456
```

Таким образом, в результате выполнения ваших строк кода мы получим, что указатель `p` будет указывать на символ '2', и вывод отобразит строку, начиная с этого символа.
*p++

Унарный оператор * (если знак перед операндом и слева нет другого операнда) это значение по адресу, на который указывает операнд (в твоем случае это p который ссылка на char (*char) выше равен buf, который инициализирован массивом символов строки "123456\x00" (0 символ в конце не показывают и не учитывают в типе константы, но он есть)
Затем идет унарный оператор ++ (правосторонний) который увеличивает на 1 значение операнда слева, т.е. *p
Т.е. данная строка увеличивает на 1 первый (точнее нулевой) элемент массива, и кстати в твоем коде это строка-константа, и так делать нельзя и поведение будет неопределенным (зависит от компилятора).

p++

увеличение адреса на 1, т.е. теперь p будет указывать не на нулевой элемент а на первый.
Похожие вопросы