第一次让左值右值引起我注意的时候是在刚接触字符串和指针的时候编译器对代码的一段错误提示
那什么是左值(l-value)那:
说的通俗一点就是可以放在赋值号左边的叫左值 就是可以被赋值的。是一个地址
左值一般是是一个变量可以被赋值的变量。(const变量是一个例外只能做右值)
那什么是右值(r-value)那:
同样我们可以说是可以放在赋值号右边的 就是可以给其他变量赋值的,
它可以是一个变量也可以是一个常量也可以是一个表达式。是一个内容
例如:
#include<stdio.h> int main() { char name[20]; char *adress; name="小明"; //错误的 adress="南极"; //正确的 }
name="小明";
这个语句中 字符数组 name 就不是一个左值 因为name 在定义的时候它是被分配道内存的栈中,
而 "小明" 是存储在内存的静态常量中 ,它在赋值的时候是将这个静态区的常量的首地址赋給一个指针变量,
所以name 字符数组不能做这里的左值 而且 name 本质上是一个数组 是将每个字符存储在单元格中 ,
虽然在按字符串格式输出的时候是一段字符串,但是实际上它本质上也是一个一个字符组到一起的。
如果要把一段字符串存储在字符数组中就需要把一个一个字符存储在数组中。
什么是表达式:
表达式由一个或多个操作数通过操作符组合而成。最简单的表达式仅包含一个字面值常量或变量。较复杂的表达式则由操作符以及一个或多个操作数构成。
一个变量是表达式但是一个表达式就不一定是变量了。
确切一点说一个简单的赋值语句
左值是一个地址 左值是左侧表达式所代表的地址
右值是右侧表达式所代表的内容。
但左值并不一定能被赋值,因为左值可以引用某个常量。 所有的引用都是左值。
右值是表达式的值(不是引用),可以放在赋值右面。
所以所有左值都可以做右值。
函数的引用参数
把参数声明成引用,实际上改变了缺省的按值传递参数的传递机制。在按值传递时,函数操纵的是实参的本地拷贝。当参数是引用时,函数接收的是实参的左值而不是值的拷贝。
这意味着函数知道实参在内存中的位置,因而能够改变它的值或取它的地址。