纯手机编写 多多包涵。
1,指针是地址,地址就是指针
2,数组名是数组变量名,左值是数组地址(指针)本身
3,数组名是首元素地址,也不是首元素地址(引新规)
4,变量名左值就是地址本身,右值是数据。
愿意看的同学往下看。 欢迎批评指正,不欢迎辱骂
在这之前,问问大家,如何理解=等号的。
对我而言,也许c++并不是这样定义的。
(左值)地址=数据(右边),
对编译器来说 把 右边数据 写入 左边地址。
什么是右值:左值。
变量名= 在等右边或没有等号时,是右值
变量名=在等号左边,是左值。
变量名是右值时,是数据的别名
变量名是左值时,是地址的别名。
我的答案:
1, 指针就是地址。
理由
int a=10; // 变量a 假设地址是a01
double b=10.0;// 变量b 假设地址是b02
int *pa=&a; // 变量pa 假设地址是pa03
double *pb=&b; //变量pb 假设地址是pb04
变量a,b 分别是 整型类型 浮点型类型。
a存放整型数据 b存储浮点型数据
pa和pb是指针类型,那他应该存放的指针类型数据
pa pb存储的是地址数据。那地址是指针类型。
结果:地址就是指针,指针就是地址
答案2:
指针(地址)没有地址,地址没有地址
地址变量pa,pb有地址,指针变量是数据类型。
哈哈 你骗人
根据左值原则 a b 分别代表地址 a01 b02
你说地址没有地址 那么 &a &b 是什么鬼?
如果我告诉你&a &b就是他们本身,就是地址(指针)
a01 b02本身,分别是10和 10.0的地址
反过来说10和10.0的地址不是&10和&10.0
对不起 &10和&10.0编译器不认识。
那么a是啥玩意?b又是啥玩意?作为左值
a就是a01的别名 b是b02的别名
a就是指针(地址a01) b就是指针(地址b02)
还记得我们说=号的用法吗 右边是数据。
变量到了右边就变成右值,代表地址里面的数据
没有=等号的时候就是右值
cout<<a<<endl; //结果是10
cout<<b<<endl; //结果是10.0
cout<<&a<<endl; //结果是a的地址 a01
cout<<&b<<endl; //结果是b的地址 b02
cout<<*a<<endl;//结果错误为什么?
cout<<*b<<endl; //结果错误为什么?
a b现在都是右值,&a &b 这就是a和b本身 a01和b02
怎么理解 变量pa pb有地址。
int *pa=&a;
double *pb=&b;
把a b的地址数据写入 左边的地址当中。
所以pa pb 和a b一样,都是地址
分别是pa03和pb04。
因为他们在左边,所以pa pb代表着变量地址。
因为是地址,所以地址就是(指针 pa pb)
等等,你说是指针pa pb?
你说指针(地址)没有地址那&pa &pb 是什么? &pa &pb作为右值就是他们本身
这个时候 pa pb分别是指针变量pa pb
&a &b不再是地址 而是地址类型的数据。
我们经常说指针的指针,就是地址的地址
严格上说是地址类型的地址 所以才说地址变量有地址。单一的地址没有地址。
就像你的sfz号码是没有sfz号码的。
等等,谁说身份号没有身份号,我车间员工名称
01后面跟着就是我的sfz号。
那不是你sfz号码的sfz号码,而是sfz号码这个数据类型的sfz号码。
那这个不是sfz号码的sfz号码,什么时候才是。
没有这个情况。
cout<<&pa<<endl; //结果是pa的地址 pa03
cout<<&pb<<endl; //结果是pb的地址 pb04
cout<<*pa<<endl; //结果是是什么?
cout<<*pb<<endl; //结果是是什么?
注意现在pa pb都是右值。
注意(*pa), (*pb)不是右值。为什么?
问题一的总结:
变量名是右值 代表着变量数据的别名
变量名是左值 代表着变量地址的别名
指针没有地址 ,指针变量有地址。
int arr=[9,8]; //假设地址是arr01
我的回答:
1,数组名是数组的地址(指针),
是地址的本身,也就是地址arr01。
2,数组名是指针(地址)
3,数组名是不是首元素地址。
有两种答案:
数组名是首元素地址,也不是首元素地址
但是不管是不是,他们的结果一样。
答案1: 来源于书本
数组名是首元素地址
理由出自
《c++ primer plus中文版 第六版》 213页。
我要说明一点是,我不知是中文翻译出错的问题
还是英文原版作者误解了,c++的标准。
还是c++标准就是规定数组名是 首元素地址。
也有可能是偷懒的行为,导致每个人都说是。
我不会英文,无法查证。
答案2:
数组名不是首元素地址,他是整个数组的地址
左值是arr01的别名。就是数组地址(指针)本身
右值是arr数组的数据内容。
但是注意
数组名和第一元素的地址 代表的东西一样。
理由:
int *parr=&arr;//编译错误
int *parr=*(&arr)// 编译成功
如果arr是首元素地址,那么&arr就是首元素地址本身 *(&arr)应该是9才对。
cout<<arr<<endl; //结果是arr[0]的地址
cout<<&arr<<endl; //结果是 arr01
cout<<*arr<<endl; //结果是 9
cout<<*(&arr)<<endl; //结果是arr[0]的地址
先说含义:
arr
arr是数组的地址(arr01)本身,是数组指针(地址)
*arr
arr是数组的地址 因为是右值就是数组的内容
*arr就是对数组的内容 取内容。为什么是9?
*(&arr)&arr是数组的地址 *(&arr)就是数组的内容
&arr
是数组的地址,这个都同意吧?
为什么arr的结果是9
要弄明白arr ,得先搞明白arr是什么鬼。
是首元素的地址吗?之前说有两种答案。 是也不是。
*arr 如果是你,你认为结果是应该什么。
是的,你的想法没错,就是数组的内容98。
但是c++并没有直接显示,操作数组数据的能力,这也是为什么数组不能对拷,赋值的原因。
//int arr[2]=98 是错的。不能这样
//int arr[2]=9,8也是错的。
我想也没有人希望得到98,都想要的是9和8
换句话说,不是c++太差劲,而是以人为本。
直接给你98是不合理的,给你9和8才是合理的。
不是c++ 不能做到
int arr[3]=987 //而是这样做没什么意义
就像你去收购脐橙,你对老板说,这两个果园我都要了。老板给你的一定是两个果园的脐橙,而不是把两个果园卖给你。
当你取数组的内容(*arr)时,我该返回数组内容?
可是我没有直接显示整个数组内容的能力啊!
那怎么办?,那我给你返回数组首元素的地址??
好的就这么办,但是不意味着他们是一样东西。
这是规定,
没有任何推导过程。这是c++给你数组内容唯一办法。
我想太多人认为数组名是首元素地址的源头
来源于此。
也可以说我之所以认为有这个规定
是因为我看到太人说数组名是首元素地址,然后综合《c++pp》 得出这么一个结论
其实有没有这个规定我不知道 ,我只是知道取数组内容时确实是得到首元素地址。编译器证实过的
大多数人选择了偷懒,说数组名就是首元素地址
对于大多数来说,不管是不是,他们都是一样的东西,不希望自己的学员在这上面浪费时间。
你可以认为除了规定*arr是首元素地址之外,
arr 依然是数组变量名 &arr依然是数组的地址
sizeof arr 依然是数组长度
cout<<arr<<endl; //结果是arr[0]的地址
cout<<&arr<<endl; //结果是 arr01
cout<<*arr<<endl; //结果是 9
cout<<*(&arr)<<endl; //结果是arr[0]的地址
再想想上面的结果
注意他们是右值 并且*arr是返回首元素地址。
问题2总结:
为了推导
*(*(&arr))=arr[0]=*arr //我花了两天时间。
后面我对自己说,可能对于目前的自己来说,知识量不够,无法推导,我只能先记着。
第三天碰到一个视频教程说,
数组名就是首元素地址,这是规定,没有推导,记住他就行了。
我觉得非常在理,有时候搞不懂先记住就好。
所以才有了 我脑洞大开,安慰自己说
c++ 对数组取值返回首元素地址的规定。
当然还参考了c++pp 这本书。
然而我并不知道有没有这个规定。
但是不管他们是不是,数组名作为右值的时候
得到的结果和首元素地址是完全一样的。
数组名是不是首元素地址 这么说你是年级第一名,
那你说你们班的第一名和年级第一名是不是一样。
如果你说是,数组名就是首元素地址,反之,不是
int a=10; //假设地址是a01int &b=a; int *pb=&a; //假设地址是pb01
*pb=5; //左值是地址 地址取值是内容 就是
a01=5;
那么 这个时候 a就是b b就是a 完全一样。
指针pb 他的内容是a01 地址pb01
目前对我来说。指针和引用效果上是一样的。
唯一的区别就是指针变量,多占用了空间。
优点指针可以重复利用,可以在不同时间指向不同的地址。
好了,我就是个自学c++ 的萌新,以上只代表本人观点,欢迎大家批评指正,
本来打算写在前面,但是我怕很多人看到萌新,就直接想反对。我希望大家能给我个说话的机会。
目前看到了c++ primer plus 第八章。
下次一起讨论变量名和指针的关系
下面展示一些 内联代码片
。
int a=10;
int arr[2]={9,8};
int *pa=&a;
int **ppa=&pa;
int ***pppa=&ppa;
int ****ppppa=&ppa;
//int *****pppppa=&ppppa;
// An highlighted block
var foo = 'bar';
本文发布于:2024-01-31 18:43:09,感谢您对本站的认可!
本文链接:https://www.4u4v.net/it/170669779130574.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
留言与评论(共有 0 条评论) |