[C]左值

一、概述

左值是一个很让人困惑的概念,通常一条赋值表达式,例如x = y; 左边的操作数一定要是一个左值才能够被赋值,否则编译器就会报错:

error: lvalue required as left operand of assignment

要搞清楚左值的含义,首先要理解C语言的“对象”这一概念:

在C语言中,对象(object)指的是在内存中的一个位置,其内容可以用来表示某个值。

左值,指的就是内存中有具体位置的对象。

赋值操作,你可以理解为给一个位置赋值,因为给位置赋值是有意义的,但是给一个没有位置的数据赋值,就说不通了。

二、示例

1.比方说声明一个变量int x = 6;

x就是左值,它在内存中的地址是:&x,指针类型是int*。它是一个有位置的对象。

(x+1)则不是一个左值,它是左值x中保存的一个int类型数据(即6)加上1的结果,它并不是内存中有具体位置的对象。

这意味着你不能这样为它赋值:(x+1) = 8;

 

2.上面是一个很简单的示例,但通常事情会显得相对复杂一点:

例如数组int arr[3] = {1, 2, 3};

arr+1得出的是一个新的指针,按照惯性思维,你可能会觉得它是一个左值,毕竟指针代表着内存地址。

实际上它不是一个左值,因为地址值也只是一个数字罢了,0xff和127没有区别。

但是把这个地址值加上间接运算符*后,它的含义就变了,变成了“以int类型访问这个内存空间",这样它就变成了有空间的对象,现在它是一个左值了:*(arr+1)。

 

猜你喜欢

转载自www.cnblogs.com/yiyide266/p/11753261.html