注册 登录
编程论坛 C++教室

同一地址,出现2个不同值。

独孤剑魔 发布于 2008-09-05 19:11, 1175 次点击
我在测试 const_cast,遇到一个问题,如下:
#include<iostream>
using namespace std;
void main()
{
    const int j = 10;
    const int *i = &j;
    cout<<"*i="<<*i<<endl;
    cout<<"i="<<i<<endl;
    int *p = const_cast<int*>(i);
    *p=*p+1;
    cout<<"j="<<j<<endl;
    cout<<"*i="<<*i<<endl;
    cout<<"*p="<<*p<<endl;
    cout<<"i="<<i<<endl;
    cout<<"p="<<p<<endl;
}

结果是:
*i=10
i=0012FF7C
j=10
*i=11
*p=11
i=0012FF7C
p=0012FF7C
Press any key to continue
因为j是const,无法改变,这个我知道,我使用了一个指向const对象的指针,于是声明了*i;为了测试 const_cast,我又声明了一个指针*p;我是这么认为的,*p指向的其实也可以说是j,在结果中,的确指向的是j,因为内存地址一样,可是,在输出此地址上的数值时,却产生了不一致,试问各位高手是怎么回事,小弟实在不知其祥!

[[it] 本帖最后由 独孤剑魔 于 2008-9-5 19:15 编辑 [/it]]
12 回复
#2
独孤剑魔2008-09-05 20:15
为什么没人回答啊???小弟十分迫切知道原因。
#3
xlh52252008-09-05 20:35
有不一至吗?明显是一样的...自己看清楚点.你用p将i的值加了1了!
至于为什么能对一个const i加1,你用了显示的强制转换const_cast,当然,通过p来改变i内存值是可以的!
#4
独孤剑魔2008-09-05 20:40
我的问题是,在同一个内存地址中,使用cout<<j<<endl与cout<<*i或*p<<endl 为什么取得的值不同!!!
#5
huihexiang2008-09-05 20:46
*p=*p+1;
#6
独孤剑魔2008-09-05 21:05
回复 5# huihexiang 的帖子
j是一个const的,我的确是改变了*i的值,但是在取得时候,无论是cout<<j,还是cout<<*i,按说都是0012FF7C上的值,为什么在0012FF7C会出现2个不同的值。你所说的*p=*p+1我当然知道,只是请各位解释下,在0012FF7C这块内存中,为什么会有10和11两个值!!!!!!
#7
huihexiang2008-09-05 22:15
经const修饰后的数据,编译器将其视为常量,不再分配内存
这个时候&j地址内的数据变化不改变j
#8
独孤剑魔2008-09-06 09:29
回复 7# huihexiang 的帖子
const int j = 10;
    const int *i = &j;
    cout<<"*i="<<*i<<endl;
    cout<<"i="<<i<<endl;
   //int *p = const_cast<int*>(i);
先不考虑注释掉的部分,你所说的const修饰后的j不在分配内存,我真的没明白,因为我声明了一个指向const对象的指针*i,i所取出的地址是谁的呢?
#9
独孤剑魔2008-09-07 00:01
没人回答么
#10
战鹰0012008-09-07 08:47
楼住你可以参考这个网址对const_cast作用的说明
http://baike.baidu.com/view/1745221.htm
#11
無邪的睡脸2008-09-07 09:37
&j,i,p确实都指向同一个地方,为什么会不同呢?

原因在于,编译器检查到j是const变量,在编译的时候就进行了替换。

也就是说用到j的地方都用10进行了替换,所以即使当前地址内容已经变为11,但输出j时依然是10
#12
caicaiha1122008-09-07 10:27
纯顶
#13
独孤剑魔2008-09-07 12:59
回复 11# 無邪的睡脸 的帖子
谢谢。。。谢谢各位了。。。
1