В 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', и вывод отобразит строку, начиная с этого символа.