解除引用的指针是否是有效的左值?
假设定义:
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 :
语义
…
- 一元
*
运算符表示间接。 如果操作数指向函数,则结果是函数指示符; 如果它指向一个对象,则结果是指定该对象的左值 。 如果操作数具有类型”指向类型’的指针,则结果具有类型”type”。 如果为指针分配了无效值,则unary*
运算符的行为未定义
也就是说
int i = 10; int *p = &i;
*p
的结果是指定对象i
的左值。
因此*p += 10
起作用,因为它是左值。
现在,如果在需要对象本身的上下文中使用左值,则将其转换为存储在指定对象中的值 。 这称为左值转换 ,当然结果值不再是左值( C11 6.3.2.1p2 )。