一个关于const的问题,同几个地址,加不加const居然不一样?!!

tarlou 2007-05-06 04:39:04
在DEV-CPP上运行如下代码,感到结果非常不可思议,请高手指教
#include <iostream>
using namespace std;
int main()
{
const int ten=10;
int *p;
p=(int *)&ten;
(*p)++;
cout<<ten<<endl; //ten is 10
cout<<&ten<<endl; //&ten is 0x22ff74
cout<<p<<endl; //p is 0x22ff74
cout<<*p<<endl; //*p is 11
cout<<*(&ten)<<endl; //*(&ten) is 10
cout<<*(int *)(&ten)<<endl; //*(int *)(&ten) is 11
cout<<*(const int*)p<<endl; //*(const int*)p is 11
return 0;
}
想不明白为什么同一个地址,用两种不同的类型输出,会得到不同的结果??
(也并非完全如此,&ten转int *是11,p转const int*却不发生变化)
请高手解释一下吧!
...全文
372 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
烂笔头Danky 2007-05-07
  • 打赏
  • 举报
回复
const volatile int ten=10;

为什么这样定义的变量,输出它的地址值是1呢?
expter 2007-05-07
  • 打赏
  • 举报
回复
高质量编程...
yoyo_alex_lw 2007-05-07
  • 打赏
  • 举报
回复
当没有volatile 关键字时,常量强制转化为非常量时,编译器实际是生成了一个临时变量保存强制转化后的值.
语句p=(int *)&ten;
实际是:
int temp=(int *)&ten;
p=&temp;
因此p指向的并不是ten.
如果加了volatile ,则不生成临时变量
fuyong_8012 2007-05-07
  • 打赏
  • 举报
回复
应该是编译器进行的优化,输出的时候直接赋为10
烂笔头Danky 2007-05-07
  • 打赏
  • 举报
回复
楼上两位是说我的疑问吗?

经过我的测试,只要变量(或类对象)带有volatile标识(无论变量是否是const),用取地址符&输出的地址都是1,需要把变量的地址转换成为非volatile的指针才能正常输出其地址值来:

volatile const int i = 20;
volatile int ival = 10;
volatile double dval = 0;

cout <<"&i = " <<(int*)&i << endl
<<"&i = " <<&i <<endl;
cout <<"&ival = " <<&ival <<endl
<<"&ival = " <<(int*)&ival <<endl

不知道为何要转换为非volatile的指针才能正常输出其地址呢?
liumingrong 2007-05-07
  • 打赏
  • 举报
回复
C++5种内存区域
常量区

自由存储区

全局/静态变量区
anmoi_yang 2007-05-07
  • 打赏
  • 举报
回复
const存储在内存的全局变量区,局部变理存储在栈区,所以加与不加const返回的地址当然不一样.
cmail 2007-05-06
  • 打赏
  • 举报
回复
代码:
#include<iostream>
using namespace std;


int main()
{
const int ten = 10;
*((int*)&ten) = 11;
cout<<ten;
return 0;
}
cmail 2007-05-06
  • 打赏
  • 举报
回复
pushl %ebp
movl %esp, %ebp
subl $24, %esp
andl $-16, %esp
movl $0, %eax
addl $15, %eax
addl $15, %eax
shrl $4, %eax
sall $4, %eax
movl %eax, -8(%ebp)
movl -8(%ebp), %eax
call __alloca
call ___main
movl $10, -4(%ebp)
movl $11, -4(%ebp)
movl $10, 4(%esp) ;直接用的10
movl $__ZSt4cout, (%esp)
call __ZNSolsEi
movl $0, %eax
leave
ret
.sect
cmail 2007-05-06
  • 打赏
  • 举报
回复
常量折叠
对于cout<<ten;函数调用时直接用10入栈了,并没有使用相应内存中的值.
eggqq007 2007-05-06
  • 打赏
  • 举报
回复
原来还可以这样,学习了。
stcatz 2007-05-06
  • 打赏
  • 举报
回复
我测试了一下,你的程序是用*p修改了const int ten的值。

cout<<ten<<endl;
这句的输出之所以没有+1是因为它读出的并不是内存中的值而是在缓存里的值。

你写成
const volatile int ten=10;
程序就会按照你所想的那样运行了。
iambic 2007-05-06
  • 打赏
  • 举报
回复
欺骗编译器的报应。对你的编译器诚实点,声明为const就不要再修改它。

65,179

社区成员

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

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