您的位置:首页 > 编程语言 > C语言/C++

关于左值和右值的理解(C语言和js犀牛书第六版P67页)及其对p、*p、&p的理解

2020-01-15 08:18 155 查看

1.关于左值和右值的理解

在C语言当中(同js中),在学习了指针知识之后,高度理解左值与右值便不再显得那么的无聊。

这个解释看起来有点傻,但是不得不说:

左值就是那些能够出现在赋值符号左边的东西,右值就是那些能够出现在赋值符号右边的东西。

例如:a=b+25;

这里,a是左值,它标识了一个可以存储结果值的点,也就是说,他有一个可以自己掌控的固定的空间,b+25是右值,因为他指定了一个值。

那么他们可以互换吗?

例如:b+25=a;

答案当然是不可以;

注意,当计算机计算b+25时它的结果必然保存在机器的某个地方。但是程序员并没有办法预测该结果会存储在什么地方,也无法保证下一次这个表达式的值仍然会存在原来的那个地放。其结果就是b+25不能当左值。因为他没有固定的标识一个点。

但是a可以作为一个右值,因为每个位置都包括了一个值。

所以总结了来看:

左值:我们主要用他的空间 ;

右值:我们主要用他的值。

字面值常量都不能为左值。

为了巩固上面的所学理论,也为了让我们更加的了解怎么回事,我们现在开始将下面的例子深入讨论:

当有代码:

char ch=‘a’;

char *cp=&ch;

那我们来看看下面的代码是什么意思?能否做左值?能否做右值?

cp; //cp是一个变量,既有存储空间,又有值,所以左值和右值都可以做;

&cp; //&cp是地址常量,只能做右值,不能做左值。

*cp+1; //它的运算顺序是,现将cp解引用,再将cp的值加1,所以是一个常量(在本题中,他表示给a+1,也就是字符b),只能做右值,不能左值;

*(cp+1); //这里的运算表示cp之后的一块空间(读取cp下一个空间的内容),既可以做左值,又可以做右值;

++cp; //这里表示给ch的地址加1,也就是给地址常量加1,可以做右值,不可以做左值;

cp++; //理由与++cp的理由相同;

*++cp; //先自加,在解引用,表示了cp的下一个空间(读取下一个空间的内容),既可以做左值,又可以做右值;

*cp++; //理由同上;

(*cp)++; //表示将cp的地址加1,是一个常量,不可以做左值,但是可以做右值;

2. P、*P和&P三者的区别

那么会经常使用到三个符号:

  1. p; //变量
  2. *p;//单纯的取p的值
  3. &p;//单纯的取p的地址

初学者经常会感到很迷茫,到底这三个符号表示什么?
我们知道,p是一个指针变量的名字,表示此指针变量指向的内存地址,如果使用%p来输出的话,它将是一个16进制数。
而p表示此指针指向的内存地址中存放的内容,一般是一个和指针类型一致的变量或者常量
而我们知道,&是取地址运算符,&p就是取指针p的地址。等会,怎么又来了个地址,它到底和p有什么区别?
区别在于,指针p同时也是个变量,既然是变量,编译器肯定要为其分配内存地址,就像程序中定义了一个int型的变量i,编译器要为其分配一块内存空间一 样。
而==&p就表示编译器为变量p分配的内存地址==,而因为p是一个指针变量,这种特殊的身份注定了它要指向另外一个内存地址,程序员按照程序的需要 让它指向一个内存地址,这个它指向的内存地址就用p表示。而且,p指向的地址中的内容就用p表示。

  • 点赞
  • 收藏
  • 分享
  • 文章举报
zhangFreedom 发布了7 篇原创文章 · 获赞 0 · 访问量 207 私信 关注
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: