&(((CPoint*)0)->y),这条语句居然没有错,但去掉前面的"&"就会出错,怎么理解?

jmcooler 2005-09-14 04:15:37
&(((CPoint*)0)->y),不仅不会出错,而且还是成员变量y的地址偏移。
即它算出的是y在CPoint里的地址偏移量。
但,把最前面那个&去掉,就不行了,运行就会有错。
...全文
242 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
goodluckyxl 2005-09-14
  • 打赏
  • 举报
回复
去掉了&后,形式如下
((CPoint*)0)->y
这样的操作当然会有问题了
0不过是强制转化后的一个地址映象是CPoint*指针类型
根本在此地址上未生成对象
操作此对象当然是不允许的

Jagen在路上 2005-09-14
  • 打赏
  • 举报
回复
取地址自然不会错,但是使用它肯定就有问题了。
megaboy 2005-09-14
  • 打赏
  • 举报
回复
先把整数0通过类型转换(CPoint*)转换为指向CPoint类型的地址,然后把此地址开始的一段内存看作CPoint类型的数据,->y指出这个CPoint类型的数据里面的y成员,再通过&取这个成员的地址,由于起始地址是0,因此这个值就是y成员的偏移量。
wanguodu 2005-09-14
  • 打赏
  • 举报
回复
把取地址和取值区分开就好理解了。取变量地址的时候,CPU不需要先访问该变量的值;但取值的时候却必须先计算地址。
我们只有在对地址0及其附近的内存进行读、写的时候,也就是取值的时候,才会产生非法内存访问异常。
楼主的代码形式上看,好像是先取((CPoint*)0)->y,再取其地址似的,很容易迷惑人。事实上,编译器是不会这么做的,它是直接计算地址的。
jmcooler 2005-09-14
  • 打赏
  • 举报
回复
是著名的Offset宏,但怎么来理解这条语句?
kobefly 2005-09-14
  • 打赏
  • 举报
回复
对亚

offset宏嘛
xiao_xiao_zi 2005-09-14
  • 打赏
  • 举报
回复
感觉是优化的结果
原来取y的地址,是该CPoint对象的基地址,加上y的偏移
现在基地址是0,就只剩下偏移量了
至于加上&不会崩溃,不加会崩溃
感觉是不加的时候因为要进行取值操作,而对象地址为0,所以崩溃
加了&后编译器优化为地址操作
不知道对不对,牛人来说说
july81 2005-09-14
  • 打赏
  • 举报
回复
你要去的地址当然需要&操作符了。
这个就是著名的offset宏的实现。
healer_kx 2005-09-14
  • 打赏
  • 举报
回复
一会试一试,我先JSP,不会是优化的问题吧?

64,683

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧