以下引用网友: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是个指针且是左值*/指针 == 地址 不总是成立 我们通常把地址和指针的概念模糊化了,或者是它俩的含义不只一个。