《C语言笔记:左值和右值》
一,什么是左值什么是右值?
位于“=”符号左边的是左值,右边的是右值。
二,左值和右值的含义。
当一个变量做左值时,编译器就认为这个变量符号所代表的含义是这个变量所对应的内存空间。
当一个变量做右值时,编译器认为这个变量符号所代表的含义是这个变量的值,也就是这个变量所对应内存空间中存的那个数值。
三,左值和右值的区别。
用一个现实中的例子类比就像是“家”这个字的含义,比如说,“我回家了”,这句话中的家就是你家的房子(类似于左值);但是,“家比事业重要”这句话中的家指的是家人(家人就是住在家所对应的那个房子里的人,类似于右值)。
说白了就是,左值 = 右值 就是 空间 = 值。
四,通过对int a[5],数组的几个关键符号(a,&a,a[0],&a[0])来理解左值和右值。
1,a:做左值时表示整个数组的所有空间(5x4 = 20g个字节),又因为c语言规定数组操作时要独立单个操作,不能整体操作数组(初始化除外),所以a不能做左值;a做右值时,表示数组首元素(数组的第0个元素,a[0])的首地址。a做右值时等同于 &a[0]。
2,&a:&a就是数组名取地址,字面意思就是数组的地址,实质上是一个常量,因此其不能被赋值,所以&a不能做左值;&a做右值时表示整个数组的首地址。
3,a[0]:做左值时表示数组第0个元素的内存空间(连续四个字节);做右值时表示数组第0个元素的值。
4,&a[0]:做左值时表示数组首元素的地址,实质上是一个常量,因此不能做被赋值,不能做左值;做右值时表示首元素的首地址,等同于a做右值。
总结:
&a和a做右值的区别,&a是整个数组的首地址,而a是数组首元素的首地址。这两个在数字上是相等的,但是意义不同。意义部同会导致参与运算时有不同的表现。比如说一个int *p; 如果p = a;那么*(p+1)就表示取出a[1]的值,指针p向前移动一个数组元素(四个字节)。如果p = &a;那么p+1就表示指针p向前移动整个数组的大小(5*4)20个字节。
&a是常量,不能做左值。
a做左值时表示整个数组的所有空间,所以它不能做左值。