const在C語言和C++中的區別
一.C語言中的const
const是C語言中保留的一個關鍵字,它用來限定一個變數是隻讀的,即不可變的。程式中使用const可以在一定程度上提高程式的健壯性,但是程式中使用過多的const,可能在對程式碼的閱讀時增加一定的難度。 “C中的const的意思是‘一個不能被改變的普通變數’,在C中,它總是佔用記憶體,而且它的名字是全域性符。C編譯器不能把const看成一個編譯期間的常量”
(1)用const修飾一般變數
注意在C語言中,用const修飾的變數必須在宣告時進行初始化(用來修飾函式的形參除外);
void fun(const int n); 正確
const char a; 錯誤
char * const p; 錯誤
const char *p;正確(注意這種為什麼是正確的),因為這裡const是修飾p指向的變數,而不是指標變數p本身
一旦一個變數被const修飾後,在程式中除初始化外對這個變數進行的賦值都是誤的。
(2)const與指標搭配使用
首先必須弄清楚兩個基礎概念:指標常量和常量指標
指標常量:即指標本身的值是不可改變的,而指標指向的變數的值是可以改變的;
常量指標:即指標指向的變數的值是不可改變的,而指標本身的值是可以改變的;
可以這樣去理解:因為指標本身也是一個變數,只不過指標存放的是地址而已,而一旦指標變成了常量,即指 針本身的值是不可變的,此時指標只能指向固定的儲存單元;指標一般會指向一個變數,如果該變數成為 一個常量,那麼該變數的值就不能被修改,即常量指標,指標指向的是一個不可變的變數。
總結:
(1)在C語言中用const去修飾一個變數,表示這個變數是隻讀的,不可通過顯式的呼叫a去修改a的值,並且此時 a仍然是一個變 量,不能等同於常量;
(2)要注意const在宣告變數時所處的位置,位置不同,在意義上可能會有很大的不同。
如果const在'*'左邊,則表示指標指向的變數的值不可變;
如果const在'*'右邊,則表示指標的值是不可變的;
二.C++中的const
C語言和C++中的const有很大區別。在C語言中用const修飾的變數仍然是一個變數;而在C++中用const修飾過後,就變成常量了。
- C++中,是否為const分配空間要看具體情況.
如果加上關鍵字extern或者取const變數地址,則編譯器就要為const分配儲存空間. - C++中定義常量的時候不再採用define,因為define只做簡單的巨集替換,並不提供型別檢查.
C++編譯器在通常情況下不為常量分配空間,而是將其值存放在符號表內.但當使用extern修飾常量時,則必須立即
為此常量分配空間(與之類似的情況還有取常量的地址等等).只所以必須分配空間,是因為extern表示"使用外部鏈
接", 這表明還會有其他的編譯單元將會使用定址的方法來引用它,因此它現在就必須擁有自己的地址.
Const在C和C++中最大的不同是,在C中,const預設具有外部連結,而C++中則是內部連結。所以當你只在定義const常量的檔案中使用該常量時,c++不給你的const常量分配空間,此時const int c = 0;相當於#define c 0;
而在C中,它會給每個const 常量分配記憶體空間