*p
- это не просто «2», это lvalue , то есть эта «2» имеет четко определенное местоположение. Значение в этом месте изменяется оператором ++
- по определению оператора ++
.
Если вы не хотите изменять значение, используйте вместо него + 1
: *p + 1
.
В C / C ++ lvalue - это значение с определенной ячейкой в памяти. Это значение можно изменить - присваиванием, увеличивая, уменьшая. Например,
int x = 0;
x = 1; // ok, x is an lvalue, assignment changes the value from 0 to 1
int *p = &x;
*p = 2; // ok, *p is an lvalue, assignment changes the value from 1 to 2
Напротив, rvalue - это значение без определенного местоположения - например, результат операции arithmeti c. Это значение не может быть присвоено, увеличено или уменьшено (это не означает, что его нельзя использовать в более крупном выражении).
Например,
int x = 0, y = 1;
(x + y) = 3; // compilation error, (x + y) is an rvalue
2++; // compilation error, 2 is an rvalue
Вот довольно простая статья, объясняющая lvalues / rvalues: https://eli.thegreenplace.net/2011/12/15/understanding-lvalues-and-rvalues-in-c-and-c