指针是左值还是左值?

时间:2011-12-09 19:08:03

标签: c++ pointers

在其他帖子中,我遇到了

  

(5.2.9 / 8)类型“指向cv1 T类型D的成员的指针”的右值可以   转换为类型为“指向cv2类型B的成员的指针”的右值   T“,其中B是D的基类(第10节),

请注意语言标准。所以我的问题,

int i = 0;
int *p = &i;
*p = 1;

在所有情况下指针都是左值吗?什么时候被视为右值?

2 个答案:

答案 0 :(得分:15)

指针不是可以是右值或左值的东西。指针是类型。唯一可以是右值或左值的是表达式

考虑这个类似的问题:“整数是左值还是右值”。嗯,都不是。 “3”是整数和右值。 “3 = I;”是非法的。但是“我= 3;”如果'i'是整数,则是合法的。所以'i'是一个整数和一个左值。 '3'是整数和右值。

答案 1 :(得分:0)

根据c standard 2011

  

除非它是sizeof运算符的操作数,否则_Alignof   运算符,一元&运算符,++运算符,-运算符或   的左操作数。运算符或赋值运算符,   没有数组类型的左值转换为存储的值   在指定对象中(不再是左值);这就是所谓的   左值转换。

     

...

     

名称“ lvalue”最初来自赋值表达式E1   = E2,其中左操作数E1必须是(可修改的)左值。最好考虑将其表示为对象   “定位符值”。

因此,由可修改的指针变量组成的表达式绝对可以充当左值,指向指针的指针也是如此:

int i = 0;

int *p;
p = &i;        // 'p' is lvalue
int *q = p;    // 'p' is rvalue, lvalue conversion

*p = i;        // '*p' is lvalue
i = *p;        // '*p' is rvalue, lvalue conversion

int **pp;   
pp = &p;       // 'pp' is lvalue
int **qq = pp; // 'pp' is rvalue, lvalue conversion

int ***ppp;
ppp = &pp;     // 'ppp' is lvalue
int ***qqq = ppp; // 'ppp' is rvalue, lvalue conversion