c++ - const变量的问题
迷茫
迷茫 2017-04-17 12:03:30
[C++讨论组]
int main(){

	const int i =0;
	int *j = (int *)&i;
	*j = 2;
	printf("&i =%ld j =%ld \n", (long)&i,(long)j);
	printf("i =%d *j=%d\n", i,*j);
    return 0;
}

输出:
&i =-1081755992 j =-1081755992
i =0 *j=2
指针的地址就是变量i地址,为何*j的值改变了,const的变量i又没变,指针j改变的到底是什么?

迷茫
迷茫

业精于勤,荒于嬉;行成于思,毁于随。

全部回复(3)
迷茫

这个问题是因为发生了“常量替换”。正如你所说的,&i和j所代表的地址是一样的,×j = 2 时, i 和 ×j所指向的那块内存值都变成了2 ,也就是说实际上 i = 2 , j = 2 。 但是,为什么输出时 i = 0 , j = 2 呢?因为,i为const变量,在输出时 编译器(注意是编译器的对于const变量的方案)将i的值由2变为了0 ,所以实际上此时i输出的不是真正内存的值而是那个被保护的值 0。因此,×j输出的才是真正的内存值。
重要的事情说三遍 “i = 0 这是编译器的对于const变量的保护方案” “i = 0 这是编译器的对于const变量的保护方案” “i = 0 这是编译器的对于const变量的保护方案”

PHPz

第二个 printf 以及被编译器优化了,即 printf("i =0 j=%d\n",j),就是楼上说的 常量替换。

伊谢尔伦

慎用指针。C++ 的指针很强大,但是在一般的应用开发中应该弱化指针的作用,所谓的没有金刚钻就别揽瓷器活。

对于一般的应用开发,指针用于下面一些地方就足够了

  • 指向新对象(new),但要记得删除(delete),毕竟不通过new创建的对象离开函数范围就被销毁了。

  • 用于数组,但应该使用索引运算(pArray[index])来使用数据元素,不要通过指针运算(*(pArray + 3))来使用数组元素。

  • 函数指针,把函数作为参数传递

  • 传出参数(慎用,尽量使用引用代替)

可能有其它遗漏的,大家补充吧。

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号