关于Const

sanmu_bradley 2007-07-06 09:20:26
两个代码段,分别如下:
//程序段1
main()
{
const int i = 0;
int *p;
p = (int *)&i;//C和C++编译运行 都没有问题(C++ 没有(int *)是err C没有是warning )
*p = 100;
cout<<i<<endl;//i == 0
cout<<*p<<endl;//*p == 100
cout<<&i<<endl;
cout<<p<<endl;//p == &i;
}
//程序段2
const int i = 0;
main()
{
int *p;
p = (int *)&i;
*p = 100;
}
编译都可以, 运行就segmentfault

请问为什么p指向i的地址,*p = 100;却没有改变i的值?
程序段2改变i的作用域为什么会导致运行错误?

...全文
204 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
sanmu_bradley 2007-07-06
  • 打赏
  • 举报
回复
实际上这个"参数做输出用"就是我要问的地方。我觉得可能是这种情况:
void fun (const Type * point, const Type & ref)
{
*point = Value1;//error
ref = Value2;//error
}
这句话的来源是:高质量C++/C编程指南--第十一章 其它编程经验 11.1.1 用const修饰函数的参数
www_adintr_com 2007-07-06
  • 打赏
  • 举报
回复
你说的输出是指通过指针/引用来从函数参数返回内容吧
sanmu_bradley 2007-07-06
  • 打赏
  • 举报
回复
还有这个问题:

如果参数作输出用,不论它是什么数据类型,也不论它采用“指针传递”还是“引用传递”,都不能加const修饰,否则该参数将失去输出功能

为什么会失去输出功能?
www_adintr_com 2007-07-06
  • 打赏
  • 举报
回复
这个和编译器对常量的处理有关吧,对于 const 值,编译器可以象 #define 一样直接用值来替换变量,所以经过预处理后 cout<<i<<endl 已经是 cout<<0<<endl 了。
taodm 2007-07-06
  • 打赏
  • 举报
回复
google “常量折叠”吧
我啃 2007-07-06
  • 打赏
  • 举报
回复
程序1
编译器进行了编译期的常量推断,从定义常量到使用i编译器会认为没有变化,直接就会用0替代i(也就是根本没有取地址)虽然说常量也分配了栈的地址,但是只有在*p才事实上取了内容
程序2
全局的常量受到保护,随意修改是非法的

64,639

社区成员

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

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