为了账号安全,请及时绑定邮箱和手机立即绑定

我想了解的是为什么指针指向常量的地址,输出值时,地址是常量的地址,结果却不一样,我知道常量不能修改,但是为什么会有这种情况?

http://img1.sycdn.imooc.com//5a27e3560001900d06660305.jpg

我想了解的是为什么指针指向常量的地址,输出值时,地址是常量的地址,结果却不一样,我知道常量不能修改,但是为什么会有这种情况?谢谢大家。

正在回答

代码语言

3 回答

这里简单回答一下 避免以后有人看到  

第一点  这个 问题  在 C 语言 和C++ 结果 可能会有区别   而且 在不同编译器可能也会有区别 

这里没有测试 不纠结不同编译器  的结果 

首先如果 是C 语言  输出结果应该都是 修改后的结果 

正常的预期是 不同编译结果也都是一样的 都是 修改后的结果 

但是在C++里面 输出的 两个值 确是不同的  大部分编译器都是不同的  

这里是因为C++ 对const 常量 进行了 优化  

如果想具体了解 可以百度 “ C++ 常量折叠” 很容易找到  结果很多


还有就是 如果 你认为你写的 是C语言的代码  跟C++没有关系?

这里可以给你个简单的建议 把 上面代码 复制 保存到.c 文件  看看 就知道了 

因为 楼主 是用cpp 文件保存的 所以 一般情况下,编译器看见cpp 文件 直接默认就用cpp 方式编译了 

c语言的好理解 毕竟  就是 同一个值 修改了  也一起修改

c++ 因为引入了 优化 

这里有个  常量 符号表 默认常量 会在 符号表保存 默认值  使用时 默认从 常量表取值

而 指针指向的 是 这个值得具体内存 所以就是说 确实 有2分 不同的值 保存了


这样 也有一个好处就是 如果你修改了 const 的值 在使用的时候  使用的 还是未修改的

既然是const  就是 不能修改的 所以 这个优化 可以为你带来的 好处就是你不小心修改了常量 

而使用时候 确实未修改的 这样 有时候 是有助于 程序健壮性的 




0 回复 有任何疑惑可以回复我~

可能是地址的引用不同了吧,开始是把80指向pi这个地址变量。然后又把这个地址变量重新指向了20,虽然还是同一个地址,但引用的值改变了

0 回复 有任何疑惑可以回复我~
 #include<stdio.h>
 main()
{
	const int il=80;
	int *pi;
	pi= (int *) &il;
	* pi=20;
	printf("%d+pi\n",*pi);
	//pi所指向地址上的值
	printf("%s+pi\n",pi);
	//pi指针所指向地址
	printf("%d+il\n",il);
	//il的值
	printf("%s+il\n",&il);
	//il的地址
	getchar();
}

这是源码

0 回复 有任何疑惑可以回复我~

举报

0/150
提交
取消

我想了解的是为什么指针指向常量的地址,输出值时,地址是常量的地址,结果却不一样,我知道常量不能修改,但是为什么会有这种情况?

我要回答 关注问题
意见反馈 帮助中心 APP下载
官方微信