-
C語言中, const修飾的全局變量是外部鏈接屬性,比如在 a.c文件中有
const int m_a = 10;
在b.c中想用這個全局變量, 在b.c中這樣
extern const int m_a; 就可以使用a.c中的m_a -
C++ 語言中, const修飾的全局變量是內部鏈接屬性, 比如在a.cpp文件中有
const int m_a = 10; 在其他文件中是沒法通過
extern const int m_a; 來使用的。
要在a.cpp文件中改成 extern const int m_a=10; 其他文件才可以使用。 -
其他不用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