有没有人能帮帮忙解答这个问题?

brxren 2003-10-09 12:41:50
#include <iostream>
using namespace std;
void main()
{
const int x=10;
// cout<<hex<<&x<<endl;
int *p;
p=(int *)&x;
*p=100;
cout<<*p<<endl;
cout<<x<<endl;
cout<<hex<<p<<endl;
cout<<hex<<&x<<endl;
}
为什么p指向的地址跟x的地址是一样的,但是输出的值却不同?const到底有什么作用?
被注销的那一行若不被注销,下面的输出结果又不一样.请给个解答!谢谢!
...全文
32 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
williamVII 2003-10-10
  • 打赏
  • 举报
回复
&x为const int*.
p=(int *)&x;
通过强制类型转换得到int *型的指针指向该内存
因而可以通过p来改变内存中的值.

这种转换必须要强制进行,否则报错,
可见这是不安全的.
brxren 2003-10-10
  • 打赏
  • 举报
回复
大家能不能把源程序编译运行后再发表意见阿?如果同时用单步跟踪内存里的值,,,,,
williamVII 2003-10-09
  • 打赏
  • 举报
回复
由于是const型,
x的值在编译时已经确定,
所以编译后,
cout<<x<<endl;已经成了cout<<10<<endl;
与x的实际存放的数无关了.

若不注销的那一行,可改第六行为:
cout<<dec<<*p<<endl;
可以得到想要的结果
Jinhao 2003-10-09
  • 打赏
  • 举报
回复
实在找不到那篇一讨论过的帖子了
Jinhao 2003-10-09
  • 打赏
  • 举报
回复
const int x=10;
// cout<<hex<<&x<<endl;
int *p;
p=(int *)&x;
*p=100;
cout<<*p<<endl;
cout<<x<<endl; //被转换成 cout<<10<<endl;
cout<<hex<<p<<endl;
cout<<hex<<&x<<endl;

这个问题讨论过
brxren 2003-10-09
  • 打赏
  • 举报
回复
说实话,我是想不通。那到底是否是编译器的缘由我不得而知,这是我们老师在讲课的时候提出来的。他呢也不知道原因!有没有完整的解释阿?
chenkuizhong 2003-10-09
  • 打赏
  • 举报
回复
关于楼主的程序
#include <iostream>
using namespace std;
void main()
{
const int x=10;
// cout<<hex<<&x<<endl;
int *p;
p=(int *)&x;
*p=100;
cout<<*p<<endl;
cout<<x<<endl;
cout<<hex<<p<<endl;
cout<<hex<<&x<<endl;
}

输出为:
100
10
0012FF7C
0012FF7C

既然p=(int *)&x;
为什么*p=100;
x=10;
我想不通



playboyxp 2003-10-09
  • 打赏
  • 举报
回复
#include <iostream>
using namespace std;
void main()
{
const int x=10;
int *p;
p=(int *)&x;//这句话其实是没用的,就是p=&a;
*p=100;//这样该是不可以的,x=100;通过指针是可以改的所以结果不一样
cout<<*p<<endl;
cout<<x<<endl;
cout<<hex<<p<<endl;
cout<<hex<<&x<<endl;
}
liao2001 2003-10-09
  • 打赏
  • 举报
回复
我认为实际上是改变了的,只不过编译器编译时进行了优化,将代码中的x替换成10了罢了,钻这种问题似乎没多大意义,因为一个优秀的程序员绝不会去修改一个const
Wolf0403 2003-10-09
  • 打赏
  • 举报
回复
如果是 const int* 指针则可以改变。
int main()
{
const int *i = new int(10);
int * p = const_cast<int *>(i);
cout << *p << endl;
*p = 20;
cout << *p << "@ addr " << '\t' << p << endl;
cout << *i << "@ addr " << '\t' << i << endl;
system("PAUSE");
}
wing0 2003-10-09
  • 打赏
  • 举报
回复
const定义的常量在程序执行过程中是不会改变的。
hcj2002 2003-10-09
  • 打赏
  • 举报
回复
cout<<*p<<endl; 这一行没有把&x所指的内存里的内容改掉,p=(int *)&x;
*p=100;也没有改掉x得值
Hot_Forever 2003-10-09
  • 打赏
  • 举报
回复
x所指的内存里面的值已经改变了,但是正如2楼所说,const的值是在编译期确定的,所以输出x的值是直接输出10
LIFEForSoft 2003-10-09
  • 打赏
  • 举报
回复
对const又知道一点,继续
ttlb 2003-10-09
  • 打赏
  • 举报
回复
这种情况,标准里规定了吗?
ttlb 2003-10-09
  • 打赏
  • 举报
回复
up
brxren 2003-10-09
  • 打赏
  • 举报
回复
那么cout<<*p<<endl; 这一行有没有把x所指的内存里的内容改掉呢?

69,373

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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