).

олагая определение:

int i  = 10;
int *p = &i;

Почему * p является допустимым значением lvalue здесь:

*p+=10; 

* Не следует оценивать значение p, хранящееся в & i, т.е. 10, и, следовательно, сгенерировать ошибку "Not lvalue"?

 aschepler24 янв. 2011 г., 21:34
*p "оценивает значение int, хранящееся в&i"при использовании в качестве значения. Но как значение равно значениюi.
 SiegeX24 янв. 2011 г., 20:51
Я не знаю, почему вы получили отрицательный голос. Я думаю, что это хороший вопрос
 Kevin24 янв. 2011 г., 21:24
Я всегда думал о*p как синонимiи никогда не сталкивался с какой-либо путаницей.
 Bob Jarvis25 дек. 2017 г., 20:18
*p всегда означает «содержимое местоположения, на которое указываетp". Разница между интерпретацией, о*p как lvalue против rvalue в том, что когда*p выглядит как lvalue это понятно, что цель состоит в том, чтобыхранить в место, на которое указываетp, в то время когда*p используется в качестве значения, это означает, что целью являетсяполучить содержимое области памяти, на которую указываетp.
 Bob Jarvis25 дек. 2017 г., 20:22
@Kevin - мое внутреннее умственное чтение*p является «объектом указателя p». Возможно, немного многословно, но мысленно это переводит*p += 10 в «объект указателя р увеличивается на 10».

Ответы на вопрос(5)

указатели указывают на объект (в общем смысле, не в ООП), а не на содержимое этого объекта. Так что да, разыменованный указатель является допустимым значением lvalue.

На очень низком уровне. Указатель - это не что иное, как адрес памяти, разыменованный указатель - это память по этому адресу.

C11 6.5.3.2p4:

Семантика

...

Одинарный* Оператор обозначает косвенность. Если операнд указывает на функцию, результатом является обозначение функции;если это указывает на объект, результатом является lvalue обозначение объект, Если операнд имеет тип «указатель на тип», результат имеет тип «тип». Если неверное значение было присвоено указателю, поведение унарного* оператор не определен

То есть с участием

int i  = 10;
int *p = &i;

результат*p это значение, которое обозначает объектi.

Следовательно*p += 10 работает, так как это lvalue.

Теперь, если l-значение использовалось в контексте, где необходим сам объект, это было быпреобразуется в значение, хранящееся в обозначенном объекте, Это называетсяпреобразование lvalueи полученное значение, конечно, больше не является lvalue (C11 6.3.2.1p2).

Решение Вопроса

именующий является выражением, которое относится к области хранения, которой можно манипулировать.

*p такое выражение, которое относится к области хранения. Это отличается от сказать10+=10; потому что10 не относится к области хранения, как переменная.

 Antti Haapala25 дек. 2017 г., 20:11
10 это выражение. Это просто не lvalue.

*p оценить значение int, хранящегося в&iт.е. 10, и, следовательно, сгенерировать ошибку "Not lvalue"?

Проще говоря,

* означает «значение по адресу».

*p означает «значение по адресу, заданное значениемp».

*p = 10; означает «установить 10 в качестве значения по адресу, указанному значениемp».

lvalue - это выражение, которое относится к объекту, хранящемуся где-то в памяти.*p также выражение, которое относится к объекту, хранящемуся в местоположенииp.

 Jens25 дек. 2017 г., 21:28
* означает «умножить».*p означает «умножить сp". :-) Контекст имеет значение ...

p. p фактически является переменной типауказатель на intи его значение инициализируется по адресуi.

Тем не менее,*p также является допустимым значением lvalue - допустимым выражением для места хранения.

Ваш ответ на вопрос