C++: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

    int*p= (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分配了空间,可以用指针修改
 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值