解除引用的指针是否是有效的左值?

时间:2011-01-23 12:42:25

标签: c pointers lvalue

假设定义:

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

为什么* p在这里是一个有效的左值:

*p+=10; 

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

5 个答案:

答案 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)

C11 6.5.3.2p4

  

<强>语义

     

...

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

即。与

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

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

因此*p += 10有效,因为它是左值。

现在,如果在需要对象本身的上下文中使用左值,则将转换为存储在指定对象中的值。这称为左值转换,结果值当然不再是左值(C11 6.3.2.1p2)。