c/c++const实现原理解析

抛出问题
下列代码输出的结果是什么?

#include<stdio.h>
#include<iostream>
using namespace std;
int main()
{/*在c++下*/
    const int a = 10;
    //a = 100;error
    int *p = (int*)(&a);
    *p = 100;//正确
    cout << *p << endl;
    cout << a << endl;
    system("pause");
}

resault:

100
10

讲解学习

原理

在C++中,被const修饰的变量,可能为其分配存储空间,也可能不分配存储空间。
有下面两种情况,会为这个变量分配存储空间:

1、当const常量为全局,并且需要在其它文件中使用时,(extern)
2、当使用取地址符(&)取const常量的地址时。

如果没有为这个变量分配空间的情况下,这个变量是不可能被改变的,也就是说,这个变量是实实在在的常量。这种情况下,没有任何争议。

解疑

下面咱们讨论文章的一开始举得例子。

const int a = 10;

变量a=10,a放在了符号表里面,这个值永远不会变。当取a的值的时候,就从符号表里面取,永远是10.

int *p = (int*)(&a);

定义一个新的指针变量p,指向变量a的地址。这时,会在栈上为变量a分配一个新的空间,存放变量a的值。然后用指针p指向这个空间。例如这个内存空间的地址是0x00FF00CC。

*p = 100;

把内存地址0x00FF00CC空间的值修改为100。

cout << *p << endl;//从内存0x00FF00CC中取值,等于100.
cout << a << endl;//从符号表中取值,等于10.

c语言中的const

int main()
{/*在c下*/
    const int a = 10;
    //a = 100;//error
    int *p = (int*)(&a);
    *p = 100;//正确
    printf("%d\n", *p);//100
    printf("%d", a);//100
    system("pause");
}

在c语言中用const修饰的是常变量,不算真正意义上的常量
不可以直接修改但可以间接修改

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值