C語言 const關鍵字用法

2021-09-20 06:18:33 字數 2430 閱讀 9143

const 是constant的縮寫,是恆定不變的意思,也常翻譯為常量、常數等。很不幸,正是因為這一點,很多人都認為被const修飾的值是常量。這是不精確的,精確的說應該是唯讀的變數,其值在編譯時不能被使用,因為編譯器在編譯時不知道其儲存的內容。那麼這個const 關鍵字有什麼用處和意義呢?

const 推出的初始目的,正是為了取代預編譯指令,消除它的缺點,同時繼承它的優點。

1、const修飾的唯讀變數

定義const 唯讀變數,具有不可變性。

例如:

const int max=100;

int array[max];

這裡如果分別建立.c 檔案和.cpp 檔案測試一下,你就會發現在.c 檔案中,編譯器會提示出錯,而在.cpp 中則順利執行,為什麼呢?我們知道定義乙個陣列必須指定其元素的個數。這也從側面證實在c語言中,const 修飾的max仍然是變數,只不過是唯讀屬性,而在c++中,擴充套件了const 的含義。

注意:const 修飾的唯讀變數必須在定義的同時初始化。

問題:那麼case 語句後面是否可以是const 修飾的唯讀變數呢?

很顯然是不可以的,case 語句後必須是乙個常量,const 修飾的唯讀變數仍然是變數,所以是不可以的,大家也可以動手試試看。

2、節省空間,避免不必要的記憶體分配,同時提高效率

編譯器通常不為普通const 唯讀變數分配儲存空間,而是將他們儲存在符號表中,這使得它成為乙個編譯期間的值,沒有了儲存與讀記憶體的操作,使得它的效率也很高。

例如:

#define m 3     //巨集常量

const int n=5; //此時並未將n放入記憶體中

.......

int i=n; //此時為n分配記憶體,以後不再分配

int i=m; //預編譯期間進行巨集替換,分配記憶體

int j=n; //沒有記憶體分配

int j=m; //再次進行巨集替換,又一次分配記憶體

const 定義的唯讀變數與#define 巨集相對比:

const 定義的唯讀變數

#define 定義的巨集常量

在程式執行過程中只有乙份拷貝(因為它是全域性的唯讀變數,存放在靜態區)

#define 定義的巨集常量在記憶體中有若干個拷貝

在編譯的時候確定其值

#define 巨集是在預編譯階段進行替換

const 修飾的唯讀變數具有特定的型別

#define 巨集沒有型別

3、修飾一般變數

一般常量是指簡單型別的唯讀變數。這種唯讀變數在定義時,修飾符const可以用在型別說明符前,也可以用在型別說明符後。例如:

int const i=2;

或 const int i=2;

4、修飾陣列

定義或說明乙個唯讀陣列可採用如下格式:

int const a[5]=;   或

const int a[5]=;

5、修飾指標
const int *p;              //p可變,p指向的物件不可變

int const *p; //p可變,p指向的物件不可變

int * const p; //p不可變,p指向的物件可變

const int *const p; //指標p和p指向的物件都不可變

乙個記憶和理解的方法:

先忽略型別名(編譯器解析的時候也是忽略型別名),我們看const 離哪個近。離誰近就修飾誰。

const int *p; //const 修飾 *p,p是指標,*p是指標指向的物件,不可變

int const *p; //const 修飾 *p,p是指標,*p是指標指向的物件,不可變

int *const p;//const 修飾 p,p不可變,p指向的物件可變

const int * const p;//前乙個const 修飾 *p,後乙個const 修飾p,指標p和p指向的物件都不可變

6、修飾函式的引數

const 修飾符也可以修飾函式的引數,當不希望這個引數值被函式體內一位改變時使用。例如:

void fun(const int i);

告訴編譯器i在函式體中的值不能改變,從而防止了使用者的一些無意的或錯誤的修改。

7、修飾函式的返回值

const 修飾符也可以修飾函式的返回值,返回值不可被改變。例如:

const int fun(void);

在另一連線檔案中引用const 唯讀變數:

extern const int i; //正確的宣告

extern const int j=10;//錯誤!唯讀變數的值不能改變

注意這裡是宣告不是定義

const關鍵字用法

1 const常量 如const int max 100 優點 const常量有資料型別,而巨集常量沒有資料型別。編譯器可以對前者進行型別安全檢查,而對後者只進行字元替換,沒有型別安全檢查,並且在字元替換時可能會產生意料不到的錯誤 邊際效應 2 const修飾類的資料成員 class a const...

const關鍵字用法

const修飾符表示該變數的值不能被改變。但得分兩種情況討論 修飾普通變數和修飾指標變數。1.普通常量 const int foo 5 表示foo不能再被賦值 foo 8 錯誤,因為foo是const修飾為不可變常量了 2.修飾指標 const char p test 表示p指向 的記憶體不可改變,...

C語言關鍵字 Const

c中const的使用 雖然這聽起來很簡單,但實際上,const的使用也是c語言中乙個比較微妙的地方,微妙在何處呢?請看下面幾個問題。問題 const變數 常量 為什麼下面的例子在使用乙個const變數來初始化陣列,ansi c的編譯器會報告乙個錯誤呢?const int n 5 int a n 答案...