以下引用网友:lm_whales
左值可以当作右值使用,右值不能当左值用.
左值可以出现在=的任何一方,
出现在=右方的左值,是把左值当作右值使用,这是非常正常的.
右值,不能当作左值使用.
能够(单独)出现在=左方的是左值(实际是左右值,左值总是可以当作右值使用)
只能够出现在=右方的,是右值(纯粹的右值),不能当作左值使用.
左值代表地址单元,右值代表数据本身.
地址单元里的数据,是左值变量的右值的含义.
右值包括,纯数据,比如常数100,字符串常量”12345”等
以及地址单元中存储的数据.比如x ,这是左值当作右值使用代表的意义.
以及一些常变量(有确切地址的常量,可以象变量一样有个名字,其实就是变量,只是右值化了,不能当左值使用了)的含义.
左值代表存储器的一个单元.
这是一个物理概念,不仅仅是个地址(地址不过是个编号,是个数值而已),是个实实在在的东西.
右值代表数据,一个数值而已.
再对上图红框部分作解释:
1.“取地址符作用于一个左值运算对象”
这句话的意思是:取出的地址值要赋给了等号左边的指针变量
2.“返回指向该运算对象的指针”
这里的“指针”只是一个地址的编号,是一个常量数值而已,不能被改变,所以是右值
代码分析:
int a=112,b=0;
/*假设a的地址为1000*/
int *p=&a,*q=nullptr;
b = *p;
/* *p是个表达式,不是个右值,但是它所指的内容[a的地址1000]被当做右值*/
q = p;
/*q是个指针且是左值*/
指针 == 地址 不总是成立
我们通常把地址和指针的概念模糊化了,或者是它俩的含义不只一个。