C++ const 与 extern

  1. C语言中, const修饰的全局变量是外部链接属性,比如在 a.c文件中有
    const int m_a = 10;
    在b.c中想用这个全局变量, 在b.c中这样
    extern const int m_a; 就可以使用a.c中的m_a

  2. C++ 语言中, const修饰的全局变量是内部链接属性, 比如在a.cpp文件中有
    const int m_a = 10; 在其他文件中是没法通过
    extern const int m_a; 来使用的。
    要在a.cpp文件中改成 extern const int m_a=10; 其他文件才可以使用。

  3. 其他不用const声明的变量, 比如在a.c中
    int m_a = 10; 要想在其他文件中使用就使用
    extern int m_a; 这样就可以了

分割线----
const修饰的变量分配内存的情况
以下情况 const变量才会分配内存
//1、局部变量const int a = 10 ;  int * p = &a //分配临时内存  指针不可修改

const int a = 10 ; 这句话表示const int a是存放在符号表中的常量,a是键,10是值。

平时是不分配空间的。int * p = &a,这句话的时候,系统会临时在栈区分配一个临时空间temp,temp空间的值是10.之后将临时空间的地址赋值给指针p。之后通过*p修改的是临时地址里面的值,函数结束后该临时空间会释放。这种情况利用指针是不能修改a的值的。

//2、当加入extern 修饰const,也会分配内存  全局区 指针不能修改

extern会将const修饰的变量提升为全局变量,但是不能修改因为该变量是在全局区的ro.data区 全局变量没有用extern const修饰,而是单纯的const修饰,那么全局变量位置还是处于ro.data,只是作用域变小,当前文件内。

//3、用变量初始化const,也会另外单独分配内存,如下    可以用指针修改值

int b =  10;

const int a = b;    //a和b的地址不一样各自独立分配空间  a地址在栈区

//4、const修饰一个普通变量的别名,别名的空间就是变量的空间。可以用指针修改

//此时f是c的别名  二者地址空间一样

intc = 5;

const int &f = c;   //f接收变量的赋值,f是c的别名,f的地址就是c的地址

cout<< &c << endl;   //地址和下面地址一样

cout<< &f << endl;

cout<< f << endl;  //结果5

intp= (int)&f;

*p= 55;

cout<< f << endl;  //结果55

cout<< c << endl;  //结果55

//5、const修饰一个字面值的别名时,分配临时空间,此时别名就是临时空间的别名,可以用指针修改值

const int &ref =10; //相当于int temp = 10;   const int& ref = temp;

int * p = (int*)&ref;

*p = 10000;

cout << ref << endl;//结果是10000,可以修改

//const int &a = 10;相当于系统首先开辟一个临时空间int temp = 10;

//之后constint& ref = temp;相当于ref是这个临时空间的别名(临时空间在栈区)。

//而const这个时候修饰的实际temp地址的别名,temp的地址在栈区。

//通过指针是可以修改该块地址空间的值的,该块空间的值变了,也就是ref别名的值变了

//那么此时const int &ref = 10;中的ref存放位置就不是符号表中,所以用指针可以修改

//其值

//只要const修饰分配内存,可以通过间接方式进行修改(根据情况,如果在栈区或者

//堆区可以修改,如果在常量区不可以修改)

//6、函数返回值中,如果时用const别名接收一个变量,那么相当于上面第四种情况,

//此时f是a的别名  二者地址空间一样

void showValue(constint & f) // const int &f  =a    f是a的别名,可以通过指针修改,

{                          //但是加上const表示不要修改!(提醒功能)

//f = 1000;

int p = (int)&f;

*p = 100;

cout << f << endl;

cout << &f<< endl;   //地址同下面相同

}

void test02()

{

int a = 10;

showValue(a);

cout << &a << endl;   //地址和上面相同

}

//7、对于自定义数据类型 ,也会分配内存  可以用指针修改值

structPerson

{stringname;

intage;};

const Person p;  //p分配了空间,可以用指针修改
————————————————
版权声明:本文为CSDN博主「五山口老法师」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/Fly_as_tadpole/article/details/89459344

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值