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

假设定义:

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

为什么* pa有效左值:

 *p+=10; 

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

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

*p是指存储区域的表达式。 这与10+=10; 因为10并不像变量那样引用存储区域。

我相信你对p的定义感到困惑。 事实上, p指向int的类型指针的变量,其值被初始化为i的地址。

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

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

在非常低的水平。 指针只是一个内存地址,一个解除引用的指针就是该地址的内存。

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

简单来说,

*表示“地址价值”。

*p表示“由*p值给出的地址值”。

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

lvalue是一个表达式,它指的是存储在内存中某处的对象。 *p也是一个表达式,它指的是存储在位置p的对象。

C11 6.5.3.2p4 :

语义

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

也就是说

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

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

因此*p += 10起作用,因为它是左值。

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