同一块内存中的值不同!

bineon 2005-11-23 12:50:13
#include <iostream.h>

main()
{
const int i = 10;
int * p = (int *)&i;
*p = 100;
cout << p << endl;
cout << *p << endl;
cout << &i << endl;
cout << i << endl;
getchar();
}


得到p和&i相同,但是*p和i不同。为什么?
...全文
328 28 打赏 收藏 转发到动态 举报
写回复
用AI写文章
28 条回复
切换为时间正序
请发表友善的回复…
发表回复
zl0126 2005-11-24
  • 打赏
  • 举报
回复
mark
uselessman 2005-11-24
  • 打赏
  • 举报
回复
建议大家学学汇编
类似(i++) + (i++) + (i++)之类的东西
在汇编里一目了然
happydivid 2005-11-24
  • 打赏
  • 举报
回复
这个问题在论坛已经提到过挺多次了。
以前的结论就是这个结果就是const常量在后面的代码中,相当于宏定义的常量,直接将常量名替换成常量值,而不是去常量名所指的地址取其值。
所以会出现上面的情况。
slovel 2005-11-24
  • 打赏
  • 举报
回复
我懂了,内存是100的,因为你饶开了CONST改变了I的值。但是由于你的变量本身是CONST,所以在输出的时候编译器作了优化,直接用10而不是I输出。
uselessman 2005-11-24
  • 打赏
  • 举报
回复
那块内存里当然是100没错
问题在于 cout<<i<<endl; 这句话执行时就压根没从内存里读东西
uselessman 2005-11-24
  • 打赏
  • 举报
回复
接上,我搞了一个
int nn = i;
在VC的汇编码里对应的是
mov dword ptr[ebp-8], 0Ah
这回楼主死心了吧
uselessman 2005-11-24
  • 打赏
  • 举报
回复
编译成.obj文件,然后debug之
找出汇编码也不难吧

我在VC里试了试,在汇编码里,你那句cout << i << endl;
i直接被替换成了0Ah
编译时就替换结束了
呵呵
slovel 2005-11-24
  • 打赏
  • 举报
回复
学习了,MARK
晨星 2005-11-24
  • 打赏
  • 举报
回复
哦,也不一定,既然标准没规定,编译器厂商怎么做都是对的,即使等于101也不能说编译器有问题。
晨星 2005-11-24
  • 打赏
  • 举报
回复
后来当然是100。
bineon 2005-11-24
  • 打赏
  • 举报
回复
撇开编译器优化不谈,你说那块内存中到底存的是什么?
ilovedudu 2005-11-24
  • 打赏
  • 举报
回复
登记
bing_huo 2005-11-24
  • 打赏
  • 举报
回复
8符合标准地代码 出什么结果都8奇怪。。。。
「已注销」 2005-11-24
  • 打赏
  • 举报
回复
main()
{
const int i = 10;
int * p = /*(int *)*/&i;
*p = 100;
cout << p << endl;
cout << *p << endl;
cout << &i << endl;
cout << i << endl;
getchar();
}

这样就是一样啦..因为你用了强制转换在那里..欺骗了编译器..
i的值是const类型的..输出来当然也是10..罗 同样*p也只能是
100..

........
yuchengliu 2005-11-24
  • 打赏
  • 举报
回复
7: *p = 100;
00401085 mov ecx,dword ptr [ebp-8]
00401088 mov dword ptr [ecx],64h

我发现这个值已经被改变了, 其内容中的值已变为 100

11: cout << i << endl;
004010DE push offset @ILT+10(endl) (0040100f)
004010E3 push 0Ah
004010E5 mov ecx,offset cout (0042aa40)
004010EA call ostream::operator<< (00401520)
004010EF mov ecx,eax
004010F1 call @ILT+0(ostream::operator<<) (00401005)

只是在输出的时候直接使用的是 10
fireinsky 2005-11-24
  • 打赏
  • 举报
回复
不错,学习!
iseatoo 2005-11-24
  • 打赏
  • 举报
回复
又学了一点知识,哈哈
fiftymetre 2005-11-23
  • 打赏
  • 举报
回复
编译器帮你做了大部分工作了。你看看深入探索C++对像模型吧
晨星 2005-11-23
  • 打赏
  • 举报
回复
还是楼上说得严密,学习一下。:)
bineon 2005-11-23
  • 打赏
  • 举报
回复
呵呵。还是不懂。
&i 和p相等,不管你怎么说,那么都表示相同的内存空间,那么,很明显,i和*p理应是相同内存空间的值。
加载更多回复(8)

64,281

社区成员

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

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