const 的问题?

cdwy411 2005-10-17 10:34:13
vc6 有下面一段代码:
void main()
{
const long i=100;
long * ptLng=NULL;
long j=0;

cout<<i<<endl;
ptLng=(long *)&i;
*ptLng=1000;
cout<<*ptLng<<endl;
cout<<i<<endl;
cout<<ptLng<<":"<<&i<<endl;
}

i是const值,ptLng是指向i的指针,通过改变 *ptLng的值,应该可以改变i的值,
这个在内存中可以清楚的看出,但实际上i的值输出的却没有变?请问为什么会这样?
...全文
643 34 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
34 条回复
切换为时间正序
请发表友善的回复…
发表回复
longlongago8 2005-11-07
  • 打赏
  • 举报
回复
learn and study
toumao 2005-11-07
  • 打赏
  • 举报
回复
我早就做过实验
无论是
const i = 3;
还是
void ChangeConst( const int i);
其中的i都可以改变。

不过,虽然改变了,却不会影响输出,
因为在包含i的表达式里,
i都是类似于#define一样的处理。
021850524 2005-11-07
  • 打赏
  • 举报
回复
yzisyz() 说得对。
slovel 2005-11-07
  • 打赏
  • 举报
回复
mark
profan2046 2005-11-07
  • 打赏
  • 举报
回复
const long i=100;
const :是声明i所引的一段内存的值是常量,及不能再修改。
*ptLng=1000; 编译器虽然未报错,但会忽略(个儿认为)

若声明改为:
long i=100; 输出就不会是 100;
而是1000;
sjchao 2005-11-07
  • 打赏
  • 举报
回复
编译器把const值复制到了内存中指定的一块区域里,读取const时从这块区域里读,而不从&i这个地址里读。所以&i指向地址的内容可以变,但i的值却不变。
tyj_3 2005-11-07
  • 打赏
  • 举报
回复
就用你的代码,怎么在VC6上输出都是1000,并没有出现你说的i值不变

#include <stdio.h>
void main()
{
const long i=100;
long *ptLng=NULL;

printf("i=%d\n",i);
ptLng=(long *)&i;
*ptLng=1000;
printf("*ptLng=%d\n",*ptLng);
printf("i=%d\n",i);
printf("%d\n%d\n",ptLng,&i);
}
xupingle 2005-11-07
  • 打赏
  • 举报
回复
你可以修改变量i所指向的地址的值,,,而不是地址所指向的变量的值.
问道er 2005-11-07
  • 打赏
  • 举报
回复
这种替换的说法听起来有道理。
等待高手解决!
hbyufan 2005-11-07
  • 打赏
  • 举报
回复
一旦定义了const变量i,那么i的值不为程序修改(当然可以被程序外的某些东西修改,如硬件).
const long i=100;//i的值不能被程序修改
const long *p=&i;//这也保证i的值不被程序修改
long * const p=&i;//这只保证指针p本身内容不被程序修改(即始终指向i),而i的值可以被程序改变.
const long * const p=&i;//这保证p和i的内容都不被程序改变.

现在再来说明原因:
const 类型的变量是不可以被程序改变的(所以在定义的时候一定要记得初始化呀),编译器常把这种类型的变量放到ROM中(当然具体的编译器有具体的处理,总之是不为程序改变的).
freebird92 2005-11-07
  • 打赏
  • 举报
回复
给我的感觉是:
const long i = 10;
就是
#define i 10;
只是加上了 i 的类型检查.
所以, 出现 i 的地方都能正确替换, 因为在编译前换成了 100 ; 所以你修改它所在的单元值,而输出的结果还是不变.
freebird92 2005-11-07
  • 打赏
  • 举报
回复
给我的感觉是:
const long i = 10;
就是
#define i 10;
只是加上了 i 的类型检查.
maguipeng1983 2005-11-07
  • 打赏
  • 举报
回复
不解,等高手回答
toumao 2005-11-07
  • 打赏
  • 举报
回复
这个问题已经说明白了呀。
const i=3;
.....//在这里省略对i的改变语句
cout<<i<<endl;

编译的时候,cout<<i<<endl;就被编译成为:
cout<<3<<endl;了。
所以,你改不改,都只是影响了内存,
而不会影响程序。
yukuang 2005-11-06
  • 打赏
  • 举报
回复
不解
kicck 2005-10-20
  • 打赏
  • 举报
回复
const的值好像是不能改变也!~

ptLng=(long *)&i;还有这句将指针指向const我也不是很理解!~
fangrk 2005-10-20
  • 打赏
  • 举报
回复
《高质量程序设计指南——C/C++》的?
doway 2005-10-17
  • 打赏
  • 举报
回复
哈,多谢 快乐机器、yzisyz 两位热心朋友!非常感谢!:)

megaboy 2005-10-17
  • 打赏
  • 举报
回复
const并不能称之为真正的常量,真正的常量是没有存储空间的,这意味着没有任何合法的手段能修改它。const并不能保证它所修饰的对象不被修改,const的真实含义,其实是readonly而非constant。
yzisyz 2005-10-17
  • 打赏
  • 举报
回复
to doway(john)

你在调试的时候,在代码编辑窗口那里 单击鼠标右键 -> go to disassembley 即可
加载更多回复(14)

65,186

社区成员

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

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