C++ const的疑问

mxmkeep 2009-05-19 09:11:46
环境:VC6
代码1:
int main()
{
const int i=2;
int* p=(int*)(&i);
*p=100;
cout<<"i的值为: "<<i<<endl;
cout<<"指针指向的变量的值: "<<*p<<endl;
cout<<"指针的值: "<<p<<endl;
cout<<"i的地址: "<<&i<<endl;
return 0;
}

结果为:
2
100
0012FF7C
0012FF7C
---------------------------------------------

代码2:
int main()
{
const int& i=2; //加了个引用
int* p=(int*)(&i);
*p=100;
cout<<"i的值为: "<<i<<endl;
cout<<"指针指向的变量的值: "<<*p<<endl;
cout<<"指针的值: "<<p<<endl;
cout<<"i的地址: "<<&i<<endl;
return 0;
}

结果为:
100
100
0012FF7C
0012FF7C
---------------------------------------------

代码3:
int main()
{
int a=2; //加了这句
const int i=a; //用a赋值
int* p=(int*)(&i);
*p=100;
cout<<"i的值为: "<<i<<endl;
cout<<"指针指向的变量的值: "<<*p<<endl;
cout<<"指针的值: "<<p<<endl;
cout<<"i的地址: "<<&i<<endl;
return 0;
}

结果为:
100
100
0012FF7C
0012FF7C
---------------------------------------------

疑问:第一段代码指针p的值与i的地址一样,为什么改变不了i的值?
改变不了,但是为什么*p又能输出100?100又存在哪里?

第二段代码加个引用后,为什么就能改i的值了?到底发生了什么?
...全文
107 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
Jalien 2009-05-19
  • 打赏
  • 举报
回复
学习~
mxmkeep 2009-05-19
  • 打赏
  • 举报
回复
恩,基本明白了,谢谢各位大哥!
goodname 2009-05-19
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 mxmkeep 的回复:]
那第二段代码呢?
加了个引用就为什么能变?
[/Quote]

第二段从本质上来讲根第三段应该是一样的。

对于第二段,由编译器找了个位置将2存放起来了,相当于匿名变量。
mxmkeep 2009-05-19
  • 打赏
  • 举报
回复
Demon__Hunter 大哥

volatile易失域?
加了之后,结果:
2
100
0012FF7C
1
---------------------
2还是2
i地址确为1....
怎么回事?
机智的呆呆 2009-05-19
  • 打赏
  • 举报
回复

#include<iostream>
using namespace std;

int main()
{
volatile const int i=2;
int* p=(int*)(&i);
*p=100;
cout<<"i的值为: "<<i<<endl;
cout<<"指针指向的变量的值: "<<*p<<endl;
cout<<"指针的值: "<<p<<endl;
cout<<"i的地址: "<<&i<<endl; return 0;
}

pengzhixi 2009-05-19
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 lingyin55 的回复:]
常量折叠:

看一个例子:

int main(int argc, char* argv[])
{
const int i=0;
int *j = (int *) &i;
*j=1;
cout < <&i < <endlcout < <j < <endl;
cout < <i < <endl;
cout < <*j < <endl;
return 0;
}

结果是

0012ff7c
0012ff7c

0

1


因为i和j都指向相同的内存地址,所以输出的前两个结果是相同的,但为什么相同的内存里的结果不相同么?--这就是常量折叠.

这个"常量折…
[/Quote]
很详细
mxmkeep 2009-05-19
  • 打赏
  • 举报
回复
那第二段代码呢?
加了个引用就为什么能变?
lingyin55 2009-05-19
  • 打赏
  • 举报
回复
常量折叠:

看一个例子:

int main(int argc, char* argv[])
{
const int i=0;
int *j = (int *) &i;
*j=1;
cout<<&i<<endlcout<<j<<endl;
cout<<i<<endl;
cout<<*j<<endl;
return 0;
}

结果是

0012ff7c
0012ff7c

0

1


因为i和j都指向相同的内存地址,所以输出的前两个结果是相同的,但为什么相同的内存里的结果不相同么?--这就是常量折叠.

这个"常量折叠"是 就是在编译器进行语法分析的时候,将常量表达式计算求值,并用求得的值来替换表达式,放入常量表。可以算作一种编译优化。
我只是改了这个地址内容,但是i还是0,

因为编译器在优化的过程中,会把碰见的const全部以内容替换掉(跟宏似的: #define PI 3.1415,用到PI时就用3.1415代替),这个出现在预编译阶段;但是在运行阶段,它的内存里存的东西确实改变了!!!

33,311

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 新手乐园
社区管理员
  • 新手乐园社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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