简单而言,在赋值运算符“=”左边的就是左值,在赋值运算符“=”后边的就是右值,感觉像是废话,但非常好理解。但更多时候,我们是为了学习和理解不同情况下左值和右值的区别,下面来举例依次说明,着层深入,来让大家解渴!
1.变量做左值和右值的区别:
如 x = 2
这里x为整形变量,这里作为左值,代表的是一块内存单元,表示的是地址。
再如x = y
现在看变量做右值情况,y做右值,这里呢就不在表示地址,而是代表该内存单元上的值!然后赋给x。
2.常量做左值和右值的区别:
继续 x = 2
这里2做右值, 2是一个常量,没有任何疑问。
而如果 1 = 2
这里我们看左值,是1是常量,这里就会有问题了,编译会报错!因为常量不可被修改、不可以被赋值!所以大家可能会听过或见过”可修改/不可修改的左值”。
3.数组名做左值和右值的区别:
例如有字符数组char a[100]
当a做右值时候,我们可以把它赋给char *类型的指针,用来指向这个数组,这种情况下数组名做右值代表该数组首元素的首地址,是常量,是完全可以的。
而数组名无论右值和还是左值,都代表是地址,是常量,因此它不可以做左值,因为常量不可被修改!所以不少同学试图再定义数组之后再试图对数组赋字符串都是错误的!
4.字符串常量做右值
字符串常量想必大家都很清楚,是用双引号括起来的字符串,既然也是常量,也理所当然不可以做左值,但做右值呢?
答案是,会表示该字符串在内存中存储位置的首地址。就就是char * p = “dotcpp.com”用法的原因。
以上四种,希望对大家深入理解左值和右值有帮助!大家有任何问题,请随时留言讨论!
其实你从头到尾就搞错了,数组其实并不能简单的看作一个变量的,他是一组指针,代表了了一系列的内存地址,比如a[],这个a表示的是这个数组内存空间的首地址,我们假设为20吧,那么a[0]的地址就是20,如果存的是数字的话,a[1]的地址就是22.为什么C语言要这样来规定了,这是因为实际上C中并没有真正意义上的数组这样一个概念的,他不想JAVA,而C为了方便程序编写者,就用这么一种特别的方式来建立了一个数组,与其说是数组,倒不如说只是C定义的一连串内存空间。而数组中的元素比如a[0]就和你上面提到的x=y中的x是一个东西,这个一定要弄明白,否则学到指针有你头疼的,后面的链表也不用学了,哈哈~~!
刚才看到你们在纠结int *ptr=a这个问题,a其实他代表的是一个地址,也就是说int *ptr=a这句话将一个地址赋给了ptr这个地址中的内存空间,如果写成int *ptr=a[0]就是将a[0]这个数字赋给了ptr这个地址中的空间,两种都不会出现编译错误的
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)