C++中一个地址两个值的情况说明

今天发现一个挺有趣的代码,运行时一个地址出现了两个值;因为在我们观念里一个地址是不可能的出现两个值的

#include <iostream>
#include <iomanip>

using namespace std;

int main()
{
		//定义一个const变量
        const int a = 10; 

		//把a的地址赋值给p
        int *p = (int *)&a;

		//通过解引用修改p所保存的地址的值
        *p = 12; 
		//setw()为输出长度
        cout<< "地址:"<< p << setw(20) << "a:" << &a <<endl;
        cout << *p << setw(10) << a << endl;


        return 0;
}

运行结果:

在这里插入图片描述

(1)C++中这种叫常量折叠;因为在C++中,使用const修饰变量后,该变量会被放置到编译器的符号表中(const修饰声明了该变量为一个常量,是不可修改的,于是为了提高运行速度,会把const修饰的变量放置编译器的符号表中),下面这句话我觉得挺好:

编译器一般不为const变量分配内存,而是将它保存在符号表中,这使得它成为一个编译期间的值,没有了存储与读内存的操作------《c语言深度解剖》

(2)因为一般声明了该变量是不可改的,当我们再去强转类型修改它的值时,其实已经修改成功了的;但是我们去打印a的时候,系统会继续去编译器中的符号表读取a的值,所以导致给我们的感觉它是存在两个值的

(3)当然我们也可以去解决掉这个问题,因为这只是因为符号表中已经存在了a的符号,且我们一开始告知编译器这个变量是不可以修改的,于是编译器才每次都从符号表中去读取a的值,我们只要加个volatile预先告知编译器这个变量可能会被修改的,让它每次都小心地去从内存读取就可以了

修改后的的代码:

#include <iostream>
#include <iomanip>

using namespace std;

int main()
{
        //加了volatile告知系统变量易变不要优化,则会只有一个地址
        volatile const int a = 10;

        int *p = (int *)&a;

        *p = 12; 
		//setw()为输出长度
        cout<< "地址:"<< p << setw(20) << "a:" << &a <<endl;
        cout << *p << setw(10) << a << endl;


        return 0;
}

在这里插入图片描述

此使a与p所保存的地址上的值已经变成一致了,关于地址值为1的情况可以点击下面的链接跳转:

关于c++中地址值为1的情况说明

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值