左值(L-value):能用“取地址&”运算符获得对象的内存地址,表达式结束后依然存在的持久化对象。左值可以出现在等号左边也能够出现在等号右边。
右值(R-value):不能用“取地址&”运算符获得对象的内存地址,表达式结束后就不再存在的临时对象。只能出现在等号右边。
可以做出以下两点理解:
1)当一个对象被用作右值的时候,用的是对象的值(内容);而被用作左值的时候,用的是对象的身份(在内存中的位置)。总之:
左值看地址,右值看内容。
2)所有的具名变量或者对象都是左值,而右值不具名。很难得到左值和右值的真正定义,但是有一个可以区分左值和右值的便捷方法:
看能不能对表达式取地址,如果能,则为左值,否则为右值。
特例:因为可以用&取得字符串字面值常量的地址,虽然它不能被赋值,但它是一个左值。
int main() { char *p = "1234"; printf("%d\n", p); printf("%d\n", &"1234"); }
为什么左值不能用&取地址呢?
1)对于临时对象,它可以存储于寄存器中,所以没办法用“取地址&”运算符;
2)对于(非字符串)常量,它可能被编码到机器指令的“立即数”中,所以没办法用“取地址&”运算符。
原文:https://www.cnblogs.com/yanghh/p/12976780.html