C++:const分配内存情况分析
//1、局部變量const int a = 10 ;??int * p = &a //分配臨時(shí)內(nèi)存??指針不可修改
????const int a = 10 ; 這句話表示const int a是存放在符號表中的常量,a是鍵,10是值。
平時(shí)是不分配空間的。int * p = &a,這句話的時(shí)候,系統(tǒng)會臨時(shí)在棧區(qū)分配一個臨時(shí)空間temp,temp空間的值是10.之后將臨時(shí)空間的地址賦值給指針p。之后通過*p修改的是臨時(shí)地址里面的值,函數(shù)結(jié)束后該臨時(shí)空間會釋放。這種情況利用指針是不能修改a的值的。
?
//2、當(dāng)加入extern 修飾const,也會分配內(nèi)存??全局區(qū) 指針不能修改
extern會將const修飾的變量提升為全局變量,但是不能修改因?yàn)樵撟兞渴窃谌謪^(qū)的ro.data區(qū)?全局變量沒有用extern const修飾,而是單純的const修飾,那么全局變量位置還是處于ro.data,只是作用域變小,當(dāng)前文件內(nèi)。
?
//3、用變量初始化const,也會另外單獨(dú)分配內(nèi)存,如下????可以用指針修改值
????int b =??10;
????const int a = b;????//a和b的地址不一樣各自獨(dú)立分配空間 ?a地址在棧區(qū)
?
//4、const修飾一個普通變量的別名,別名的空間就是變量的空間。可以用指針修改
????//此時(shí)f是c的別名??二者地址空間一樣
????intc = 5;
????const int &f = c;???//f接收變量的賦值,f是c的別名,f的地址就是c的地址
?
????cout<< &c << endl;???//地址和下面地址一樣
????cout<< &f << endl;?
?
????cout<< f << endl;??//結(jié)果5
????int*p= (int*)&f;
????*p= 55;
????cout<< f << endl;??//結(jié)果55
????cout<< c << endl;??//結(jié)果55
?
?
//5、const修飾一個字面值的別名時(shí),分配臨時(shí)空間,此時(shí)別名就是臨時(shí)空間的別名,可以用指針修改值
????const int &ref =10; //相當(dāng)于int temp = 10;???const int& ref = temp;
????int * p = (int*)&ref;
????*p = 10000;
????cout << ref << endl;//結(jié)果是10000,可以修改
?
????//const int &a = 10;相當(dāng)于系統(tǒng)首先開辟一個臨時(shí)空間int temp = 10;
????//之后constint& ref = temp;相當(dāng)于ref是這個臨時(shí)空間的別名(臨時(shí)空間在棧區(qū))。
????//而const這個時(shí)候修飾的實(shí)際temp地址的別名,temp的地址在棧區(qū)。
????//通過指針是可以修改該塊地址空間的值的,該塊空間的值變了,也就是ref別名的值變了
?
????//那么此時(shí)const int &ref = 10;中的ref存放位置就不是符號表中,所以用指針可以修改
????//其值
?
????//只要const修飾分配內(nèi)存,可以通過間接方式進(jìn)行修改(根據(jù)情況,如果在棧區(qū)或者
????//堆區(qū)可以修改,如果在常量區(qū)不可以修改)
?
//6、函數(shù)返回值中,如果時(shí)用const別名接收一個變量,那么相當(dāng)于上面第四種情況,
?
//此時(shí)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、對于自定義數(shù)據(jù)類型 ,也會分配內(nèi)存??可以用指針修改值
structPerson
{stringname;
intage;};
const Person p;??//p分配了空間,可以用指針修改
?
總結(jié)
以上是生活随笔為你收集整理的C++:const分配内存情况分析的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: UNIX:缓冲区和重定向
- 下一篇: C++:引用