假设定义:
int i = 10;
int *p = &i;
为什么* p在这里是一个有效的左值:
*p+=10;
不应该* p评估存储在& i的int的值,即。 10,因此生成“不是左值”错误?
答案 0 :(得分:13)
左值是一个引用区域的表达式 可以操纵的存储空间。
*p
是一个表达存储区域的表达式。这与10+=10;
不同,因为10
并不像变量那样引用存储区域。
答案 1 :(得分:2)
我相信你对p
的定义感到困惑。事实上,p
是指向int 的类型的变量,其值初始化为i
的地址。
尽管如此,*p
也是一个有效的左值 - 一个存储位置的有效表达式。
答案 2 :(得分:2)
用非常简单的话来说,指针指向一个对象(一般来说,非OOP意义上),而不指向该对象的内容。所以是的,一个解除引用的指针是一个有效的左值。
非常低级别。指针只是一个内存地址,一个解除引用的指针就是该地址的内存。
答案 3 :(得分:2)
不应
*p
评估&i
中存储的int的值,即。 10,因此生成“不是左值”错误?
简单来说,
*
表示“地址价值”。
*p
表示“地址值p
”。
*p = 10;
表示“将10设置为p
”值给出的地址值。
lvalue是一个表达式,它引用存储在内存中某处的对象。 *p
也是一个表达式,指的是存储在p
位置的对象。
答案 4 :(得分:1)
<强>语义强>
...
- 一元
醇>*
运算符表示间接。如果操作数指向函数,则结果是函数指示符; 如果它指向 对象,则结果是指定 对象的左值。如果操作数的类型为&#39;&#39;指向&#39;&#39;,则结果的类型为&#39;&#39; type&#39;&#39;。如果为指针分配了无效值,则一元*
运算符的行为未定义
即。与
int i = 10;
int *p = &i;
*p
的结果是指定对象i
的左值。
因此*p += 10
有效,因为它是左值。
现在,如果在需要对象本身的上下文中使用左值,则将转换为存储在指定对象中的值。这称为左值转换,结果值当然不再是左值(C11 6.3.2.1p2)。