1. 程式人生 > >C語言const關鍵字的用法總結

C語言const關鍵字的用法總結

一、const修飾普通變數

1、說 const 定義的是變數,但又相當於常量;說它定義的是常量,但又有變數的屬性,所以叫常變數。用 const 定義常變數的方法很簡單,就在通常定義變數時前面加 const 即可,如:

const int a = 10;

int const a = 10;

 

這兩種寫法都是正確的,但是下面這種寫法是錯誤的

int const a;

a = 10;

 用 const 定義的變數的值是不允許改變的,即不允許給它重新賦值,即使是賦相同的值也不可以。所以說它定義的是隻讀變數。這也就意味著必須在定義的時候就給它賦初值。

2、const修飾的變數與普通變數的區別?

用 const 修飾的變數,無論是全域性變數還是區域性變數,生存週期都是程式執行的整個過程。全域性變數的生存週期為程式執行的整個過程這個是理所當然的。而使用 const 修飾過的區域性變數就有了靜態特性,它的生存週期也是程式執行的整個過程。我們知道全域性變數是靜態的,靜態的生存週期就是程式執行的整個過程。但是用const修飾過的區域性變數只是有了靜態特性,並沒有說它變成了靜態變數。

 

二、const與define

const與define從功能上很想,但是又有明顯的區別

1、define是預編譯指令,而const是普通變數的定義。define定義的巨集是在預處理階段展開的,而const定義的只讀變數是在編譯執行階段使用的。

2、const定義的是變數,而define定義的是常量。

define定義的巨集在編譯後就不存在了,它不佔用記憶體,因為它不是變數,系統只會給變數分配記憶體。但const定義的常變數本質上仍然是一個變數,具有變數的基本屬性,有型別、佔用儲存單元。

可以說,常變數是有名字的不變數,而常量是沒有名字的。有名字就便於在程式中被引用,所以從使用的角度看,除了不能作為陣列的長度,用const定義的常變數具有巨集的優點,而且使用更方便。所以程式設計時在使用const和define都可以的情況下儘量使用常變數來取代巨集。

3、const定義的是變數,而巨集定義的是常量,所以const定義的物件有資料型別,而巨集定義的物件沒有資料型別。所以編譯器可以對前者進行型別安全檢查,而對後者只是機械地進行字元替換,沒有型別安全檢查。這樣就很容易出問題,即“邊際問題”或者說是“括號問題”

 

三、const與指標變數辨析

const int *p        //p本身不是const的,而p指向的變數是const的
int const *p        //p本身不是const的,而p指向的變數是const的
int * const p;      //p 本身是 const 的,而 p 指向的變數不是 const 的
const int * const p;//p 本身是 const 的,而 p 指向的變數也是 const 的

總結:const修飾誰,誰就是const型別的

 

四、const和函式形參(用const修飾指標作函式形參)

在給函式傳參時,為了防止在函式內部改變形參的值(指標所指向的值),通常給該函式傳一個不可改變的指標,這就是所謂的輸入型引數。