C++中的const的記憶體分配問題
阿新 • • 發佈:2019-01-27
在c++我們知道一般是採用const來進行替代#define的。
例如:
const int N=3;//注意採用的是賦值的形式並且末尾有分號
#define N 3
在C中我們知道#define進行預定義的某個數是不(謝謝網友,打字問題哈哈)分配記憶體的,其檔案在編譯預處理過程中就會用定義好的資料去替代文中的符號。
但是const卻是不一樣的,一般情況下編譯器也是不為const建立空間的,只是將這個定義的數字儲存在符號表中的。但是在下列幾種情況下編譯器會為const定義的常量分配記憶體的。
1.使用了extern頭
因為使用了extern我們將可能在外部檔案使用N,而const預設的是內部連結,所以我們必須要為之分配記憶體的。extern const int N=3;
2.取地址操作
#include<iostream> using namespace std; const int M=3; int main() { const int *p=&M;//當編譯器發現有對const定義的常量進行取地址操作時候會對M進行記憶體分配, //注意這個地址是const int*型別的,地址中的內容不可以改變的 int *pp=(int*)(&M)//此處我們將const int*型別強制轉化成int * 但是對於*pp的任何賦值操作還是會報錯的, //因為本質上的M是常量不可改變的,這也是const的優點 cout<<*p<<endl; return 0; }
3.const定義的常量未知的時候,這是#define無法實現的。
#include<iostream> using namespace std; int main() { const int b=cin.get();//此處const定義的b是未知的所以要為它分配記憶體,但是一旦分配就不可以改變的。 //但是如果讀者此處想在利用未知的const常量來定義陣列還是會報錯的。 //即int array[b]是不行的,因為編譯器在從上往下走的時候是要確定陣列的大小的 //但是採用new操作就不會報錯的int *array=new int(b); cout<<b<<endl; return 0; }