24

假设定义:

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

为什么 *pa 在这里是有效的左值:

*p+=10; 

不应该 *p 评估存储在 &i 的 int 的值,即。10,因此产生“不是左值”错误?

4

5 回答 5

14

左值是一个表达式,它引用可以操作的存储区域。

*p是这样一个表示存储区域的表达式。这与 say 不同,10+=10;因为10它不像变量那样引用存储区域。

于 2011-01-24T19:58:38.580 回答
2

我相信您对 的定义感到困惑pp实际上是一个指向 int 类型指针的变量,它的值被初始化为 的地址i

尽管如此,*p它也是一个有效的左值 - 一个存储位置的有效表达式。

于 2011-01-24T20:19:52.633 回答
2

用非常简单的话来说,指针指向一个对象(在一般的非 OOP 意义上),而不是指向该对象的内容。所以是的,取消引用的指针是一个有效的左值。

在非常低的水平方面。指针只不过是内存地址,取消引用的指针是该地址处的内存。

于 2011-01-25T10:42:43.143 回答
2

不应*p评估存储在的 int 的值&i,即。10,因此产生“不是左值”错误?

简单来说,

*意思是“地址的价值”。

*p意思是“在地址上的值由p”的值给出。

*p = 10;表示“将 10 设置为由”的值给出的地址的值p

lvalue 是一个表达式,它引用存储在内存中某处的对象。*p也是一个引用存储在 location 的对象的表达式p

于 2013-10-09T13:01:11.233 回答
2

C11 6.5.3.2p4

语义

...

  1. 一元运算*符表示间接。如果操作数指向一个函数,则结果是一个函数指示符;如果它指向一个对象,则结果是一个指定对象的左值。如果操作数的类型为 ''pointer to type'',则结果的类型为 ''type''。如果已为指针分配了无效值,则一元运算符的行为*未定义

即与

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

的结果*p是指定对象的左值i

Therefore *p += 10 works, as it is an lvalue.

Now, if an lvalue were used in a context where the object itself is needed, it would be converted to the value stored in the designated object. This is called the lvalue conversion, and the resulting value of course isn't an lvalue anymore (C11 6.3.2.1p2).

于 2017-12-25T18:59:55.260 回答