Не должен *p
вычислять значение int, хранящееся в &i
, т.е. 10 и, следовательно, сгенерировать ошибку "Not lvalue"?
Проще говоря,
*
означает «значение по адресу».
*p
означает «значение по адресу, заданное значением p
».
*p = 10;
означает «установить 10 в качестве значения по адресу, заданному значением p
».
lvalue - это выражение, которое относится к объекту, хранящемуся где-то в памяти. *p
также является выражением, которое относится к объекту, хранящемуся в местоположении p
.