这些指针左值吗?

时间:2016-08-17 15:52:34

标签: c object lvalue

根据" C - A Reference Manual",左值是一个表达式,它以一种可以检查或改变对象的方式引用一个对象。

例如,

int ranks[10];

然后是ranksranks+3左值?由于ranks(指向数组的第一个元素的指针)和ranks+3(指向数组的第四个元素的指针)引用对象,我猜它们是左值 - 或者它们不是左值?

2 个答案:

答案 0 :(得分:3)

ranks+3不是左值,原因与1+3不是左值相同;结果只是一个数字(指针),而不是对象的引用。

换句话说,如果ranks + 3的结果是0xdeadbeef,则无法写

0xdeadbeef = 10;

出于同样的原因你不能写

4 = 10;

但是,*(ranks+3) 是左值,因为您解除引用指针值;它是ranks数组的4 th 元素,相当于ranks[3]

同样,ranks不是左值,除非在sizeof或一元&运算符的上下文中。由于数组表达式"衰变"对于大多数情境中的指针表达式,你再次了解

的情况
ranks = 10;

等同于

0xdeadbeef = 10;  

同样,您必须取消引用 ranks作为*ranksranks[0]才能成为左值。

答案 1 :(得分:2)

在此上下文中,名称不是左值,但可以使用*取消引用它们以形成左值。例如:

int ranks[10];
// ranks = 42; <--- doesn't compile!   error: assignment to expression with array type
*ranks = 42;   // OK: same as ranks[0] = 42
//ranks+3 = 42; <--- error: lvalue required as left operand of assignment
*(ranks+3) = 42; //OK: same as ranks[3] = 42

This answer列出了当数组的名称衰减到指向数组第一个元素的指针时C中的少数情况。在作业的左侧不是其中一种情况。因此,在ranks = ...中,ranks是(衰减,充当)指向数组第一个元素的指针。您必须取消引用该指针(*ranks)以将其中一个数组元素作为左值。

请不要问我左值是多少。我知道它,当我看到它。 :)

在gcc上测试。