社区
C++ 语言
帖子详情
超奇怪问题
MagicCarmack
2006-04-25 11:00:41
#include<iostream.h>
void main()
{
const int x=100;
cout<< int(&x) <<endl;
int *iptr=(int*)((void*)(&x));
*iptr=200;
cout<<int(iptr)<<' '<<int(&x)<<endl;
cout<<*iptr<<' '<<x<<endl;
}
VC6.0下输出结果为
1245052
1245052 1245052
200 100
老大帮我分析一下程序
...全文
427
16
打赏
收藏
超奇怪问题
#include void main() { const int x=100; cout<< int(&x) <<endl; int *iptr=(int*)((void*)(&x)); *iptr=200; cout<<int(iptr)<<' '<<int(&x)<<endl; cout<<*iptr<<' '<<x<<endl; } VC6.0下输出结果为 1245052 1245052 1245052 200 100 老大帮我分析一下程序
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
16 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
MagicCarmack
2006-04-27
打赏
举报
回复
结贴算了
大概有个眉目了
jjzhyh586
2006-04-26
打赏
举报
回复
#include<iostream.h>
void main()
{
const int x=100;
const int *p=&x;
cout<< int(&x) <<endl;
/a1/int *iptr=(int*)((void*)(&x));
/a2/*iptr=500;
/b1/int *jptr=(int*)(p);
/b2/*jptr=300;
cout<<int(iptr)<<' '<<int(jptr)<<' '<<int(&x)<<endl;
cout<<*iptr<<' '<<*jptr<<' '<<x<<' '<<*p<<endl;
}
先看调试结果。
1245052
1245052 1245052
300 300 100 300
当
b1,b2放在ai,a2前面时是
500 500 100 500
用const 声明的*p值变啦?
这个怎么解释...
难道const只是形式上的不可改变的变量?
只是不能用x=200;或*p=200;
这样的语句而已吗?
kundy
2006-04-26
打赏
举报
回复
学习!
jjzhyh586
2006-04-26
打赏
举报
回复
楼上说的对。制定编译器的时候,编译器见到X就打出初始化时候的值.COUT<<X<<ENDL;
等于
COUT<<100<<ENDL;
在看这里的解释
http://dev.csdn.net/develop/article/83/83854.shtm
rexking0
2006-04-26
打赏
举报
回复
直接对地址的操作都是可以改变的。如楼上有说,见x就输出100的可能性很大。
就像c++ 类中的私有成员,用地址的话都是可以直接访问的。
leolovefun
2006-04-26
打赏
举报
回复
先前见到有说是<< 常量折叠 >>,有点不太明白,这里有人知道是什么意思吗?
老道_
2006-04-26
打赏
举报
回复
就是上面的几位说的,const int x=100;
编译器一看到它就执行cout<<x<<endl;了,
你可以改成int x=100看看,此时cout<<*iptr<<' '<<x<<endl;输出的都是200
wengerbin
2006-04-26
打赏
举报
回复
楼上的"const int *p=&x;" 说的是 P不可改变.而对于其指向地址的内容是可变的.
cdef9108
2006-04-26
打赏
举报
回复
学习中
du51
2006-04-26
打赏
举报
回复
对x取址是那个空间,但是,见到X就进行替换。
du51
2006-04-26
打赏
举报
回复
为什么同一个地址里的内容却不一样呢?
因为对x进行了简单的替换,而不是取出来的。
MagicCarmack
2006-04-26
打赏
举报
回复
include<iostream.h>
void main()
{
const int x=100;
cout<< int(&x) <<endl;
int *iptr=(int*)((void*)(&x));//在这里的时候iptr是指向x的吧,也即地址(1245052)
*iptr=200; //这个200是不是存进地址1245052里呢?
//如果不是,那200存放在何处呢?如果是,那100又在存放在哪里呢?
cout<<int(iptr)<<' '<<int(&x)<<endl; //这里输出是同一个地址1245052
cout<<*iptr<<' '<<x<<endl; //但为什么同一个地址里的内容却不一样呢?
}
VC6.0下输出结果为
1245052
1245052 1245052
200 100
ykzhujiang
2006-04-25
打赏
举报
回复
我看了一下汇编的代码,在cout<<x的时候
直接就是push 64h 传递的值
我觉得对于这种const int可能处理方式就是能编译期确定的仍然编译期进行常量替换,剩下的才进行取址
MagicCarmack
2006-04-25
打赏
举报
回复
我现在最大的疑问就是x和iptr指向同一个地址
但是输出的内容却不一样,那个200是放在什么地方的呢?
ykzhujiang
2006-04-25
打赏
举报
回复
g++下结果类似,对于这种情况下不知道C++标准中是否对于实现方式有规定,关注一下
du51
2006-04-25
打赏
举报
回复
随编译器有所不同.
在有些编译器里const常量是类似于宏那样定义的.
只要见到x就输出100
电脑USB的
超
奇怪
问题
一位用户遇到移动硬盘通过USB连接到电脑时无法被识别的
问题
,除非进行重启。尝试了多种解决方案,包括增加辅助电源、取消电源节省选项和更新BIOS,但
问题
依旧。讨论涉及主板设计、BIOS设置和USB接口的潜在
问题
。
用JAVA反射会遇到什么
问题
,在JAVA反射中间遇到的
超
奇怪
的
问题
!
本文通过一个简单的Java示例展示了如何使用反射来获取指定对象的方法名称,并探讨了当尝试访问特定方法名时出现意外结果的原因。
打代码中遇到的
奇怪
的事情
本文记录了两个关于日志记录的
奇怪
现象:一是未被引用的控制器频繁被调用,二是第三方记录的操作次数远
超
本地记录,涉及接口调用、日志分析及数据一致性等
问题
。
洛谷 P1135
奇怪
的电梯 刷题笔记 DFS
该博客围绕洛谷P1135
奇怪
的电梯
问题
展开,采用深度优先算法求解。分析题目后进行直接暴搜,保证搜遍所有路径,用状态数组存到每个位置的最少步数,若当前步数
超
最少步数则不搜索,最后给出完整代码实现。
C++ 语言
65,211
社区成员
250,514
社区内容
发帖
与我相关
我的任务
C++ 语言
C++ 语言相关问题讨论,技术干货分享,前沿动态等
复制链接
扫一扫
分享
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++
技术论坛(原bbs)
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
请不要发布与C++技术无关的贴子
请不要发布与技术无关的招聘、广告的帖子
请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下
试试用AI创作助手写篇文章吧
+ 用AI写文章