1. 程式人生 > >C++中的const的記憶體分配問題

C++中的const的記憶體分配問題

     在c++我們知道一般是採用const來進行替代#define的。

   例如:

const int N=3;//注意採用的是賦值的形式並且末尾有分號
#define N 3

     在C中我們知道#define進行預定義的某個數是不(謝謝網友,打字問題哈哈)分配記憶體的,其檔案在編譯預處理過程中就會用定義好的資料去替代文中的符號。

    但是const卻是不一樣的,一般情況下編譯器也是不為const建立空間的,只是將這個定義的數字儲存在符號表中的。但是在下列幾種情況下編譯器會為const定義的常量分配記憶體的。

  1.使用了extern頭

extern const int N=3;
因為使用了extern我們將可能在外部檔案使用N,而const預設的是內部連結,所以我們必須要為之分配記憶體的。

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;
	
}