我想了解的是为什么指针指向常量的地址,输出值时,地址是常量的地址,结果却不一样,我知道常量不能修改,但是为什么会有这种情况?谢谢大家。
这里简单回答一下 避免以后有人看到
第一点 这个 问题 在 C 语言 和C++ 结果 可能会有区别 而且 在不同编译器可能也会有区别
这里没有测试 不纠结不同编译器 的结果
首先如果 是C 语言 输出结果应该都是 修改后的结果
正常的预期是 不同编译结果也都是一样的 都是 修改后的结果
但是在C++里面 输出的 两个值 确是不同的 大部分编译器都是不同的
这里是因为C++ 对const 常量 进行了 优化
如果想具体了解 可以百度 “ C++ 常量折叠” 很容易找到 结果很多
还有就是 如果 你认为你写的 是C语言的代码 跟C++没有关系?
这里可以给你个简单的建议 把 上面代码 复制 保存到.c 文件 看看 就知道了
因为 楼主 是用cpp 文件保存的 所以 一般情况下,编译器看见cpp 文件 直接默认就用cpp 方式编译了
c语言的好理解 毕竟 就是 同一个值 修改了 也一起修改
c++ 因为引入了 优化
这里有个 常量 符号表 默认常量 会在 符号表保存 默认值 使用时 默认从 常量表取值
而 指针指向的 是 这个值得具体内存 所以就是说 确实 有2分 不同的值 保存了
这样 也有一个好处就是 如果你修改了 const 的值 在使用的时候 使用的 还是未修改的
既然是const 就是 不能修改的 所以 这个优化 可以为你带来的 好处就是你不小心修改了常量
而使用时候 确实未修改的 这样 有时候 是有助于 程序健壮性的
可能是地址的引用不同了吧,开始是把80指向pi这个地址变量。然后又把这个地址变量重新指向了20,虽然还是同一个地址,但引用的值改变了
#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(); }
这是源码