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

来源:4-3 变量和指针的本质

丶低调丶

2017-12-06 20:34

http://img.mukewang.com/5a27e3560001900d06660305.jpg

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

写回答 关注

3回答

  • 实时编程
    2020-11-24 18:05:49

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

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

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

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

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

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

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

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


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

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

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

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

    c++ 因为引入了 优化 

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

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


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

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

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




  • L明日浅虹
    2018-05-23 16:26:45

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

  • 丶低调丶
    2017-12-06 20:34:40
     #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();
    }

    这是源码

Linux C语言指针与内存

指针-C语言的核心,代领大家对c语言有更加深刻的理解

116475 学习 · 250 问题

查看课程

相似问题