C語言const幾種常見用法

2021-06-22 22:44:32 字數 2673 閱讀 1932

作為乙個c程式設計師,const是最常用到的關鍵字之一,當然也是c語言面試最常被問到的經典問題之一。初學者常被這個關鍵字困擾,也因此在面試時倒在const的石榴裙下。這個關鍵字也困擾了我很長時間,為了讓自己記憶深刻一點,故做了這個學習筆記。

(注:在寫本篇學習筆記時,本人學習和參考了網路文章,並做了借鑑,感謝各位前輩的分享。如果本文對您有所幫助,您可以隨意分享,如果發現文中有誤,也請指教,謝謝。本文用到的除錯工具:c-free 5.0,作業系統:windows 7)

const常見的幾種用法可歸納如下:

1、修飾常量;

2、修飾指標;

3、修飾函式引數及其返回值;

4、修飾類的常量及其成員函式;(本文適用物件為c語言,暫按下不表)

1、修飾常量:const int num=10; 或者 int const num=10;

解釋:(1)很多人看到const這個關鍵字首先想到的就是常量,其實const並不能把變數變成常量,我更喜歡把const理解為「唯讀」,意思是被const修飾的部分為唯讀,不能被修改。

由於這裡const修飾的是int,意為num為乙個唯讀變數,但如果你能取到num的位址,人為將num的位址修改,這是被允許的。比如:

num=20;  // 錯誤,唯讀常量不可被修改

int * num=#

*num=20;  // 允許,這個時候num的值被修改為20

看到這裡,是不是有一種不怕賊偷就怕賊惦記的感覺,如果你想改變一些事,你總能找到辦法。當然,我們只是解釋const的作用域,如果你在程式中寫出這樣的語句,我本人是很不提倡的,如果你想修改這個變數,又何必將其用const修飾,如此大費周章,程式也會讓後人維護的時候費解。

(2)const在修飾常量的時候,經常會被拿來與#define對比。比如:

#define pi 3.14

const double pi=3.14;

說到const和#define的區別,教科書中的記錄為:

無參巨集不是符號常量,沒有資料型別,沒有值,在記憶體中不分配位址,在預處理的時候做巨集替換,不會做型別檢查;

const定義的常量是符號常量,有資料型別,也有值,在記憶體中有位址,編譯時做型別檢查。

說到這裡,前輩指點後輩的時候都會語重心長的說:能用const就不要用#define。其實除此之外,const還有個好處,節約記憶體,如下;

#define pi 3.14  // 使用#define巨集

const double pi=3.14;  // 使用const,這時候pi並沒有放入記憶體中

double a=pi;  // 編譯時分配記憶體

double b=pi;  // 在該變數作用域內,第一次出現時分配記憶體,之後再次出現都不分配記憶體

double c=pi;  // 編譯時分配記憶體

double d=pi;  // 不再分配記憶體

const定義的常量,系統只為它分配一次記憶體,而使用#define定義的巨集常量,之後的每次出現都會分配記憶體,由此可見const可以節約不少空間。看到這裡,有的朋友表示,**十年代用c語言摳記憶體,是因為那個年代記憶體小,而今非昔比,現在記憶體白菜價,動輒4g、8g,這樣實則沒有必要。而我認為,記憶體優化永遠都是系統優化的重中之重,特別是作為併發伺服器,積少成多非常明顯,更何況,作為乙個c語言愛好者,程式的完美輕巧應該是我們永遠的追求。

2、修飾指標,看如下幾種典型用法:

(1)const int * a=10;  // 修飾常量-指向常量的指標

(2)int const * b=20;  // 修飾常量-指向常量的指標

(3)int * const c=30;  // 修飾指標-常指標

(4)const int * const d=40;  // 修飾常量和指標-指向常量的常指標

判斷const的作用域,有個小技巧:如果const出現在最左邊,則修飾在它右邊最近的第乙個字元,否則const修飾的是它左邊全部的字元。

在這裡,(1)和(2)是同等的,都是指向常量,所以:

*a=11;  // 錯誤,常量不可被修改

*b=21;  // 錯誤,常量不可被修改

int n=100;  // 宣告乙個整型變數

a=&n;  // 正確,位址可被修改,執行後*a=100

b=&n;  // 正確,位址可被修改,執行後*b=100

int n=100;  // 宣告乙個整型變數

c=&n;  // 錯誤,位址為唯讀,不可被修改

*c=100;  // 可以,值可以被修改

int n=100;  // 宣告乙個整型變數

d=&n;  // 錯誤,位址為唯讀,不可被修改

*d=100;  // 錯誤,常量不可被修改

3、修飾函式引數及其返回值,如下:

(1)char * strcpy(char * dest, const char * src);

(2)const int fun();

函式(1)對於c語言學習者來說一定不會陌生,const在這裡是為了保護源字串不被修改。在指標或者引用傳值的場合,如果想保護源值不被修改,const的出現就非常必要。

函式(2)保護返回值不被修改。有部分學習者認為,接收const的返回值,其接收變數也必須為const修飾,否則會報錯,比如:

const int a=fun();  // 正確

int b=fun();  // 錯誤

但是我在c-free 5.0中,第二種情況並不會報錯。或許因為工具版本的問題,這個留下來給各位討論吧。

C語言中const的幾種用法區分

你知道我們宣告乙個變數時象這樣int i 這個i是可能在它處重新變賦值的。如下 int i 0 i 20 這裡重新賦值了 不過有一天我的程式可能需要這樣乙個變數 暫且稱它變數 在宣告時就賦乙個初始值。之後我的程式在其它任何處都不會再去重新對它賦值。那我又應該怎麼辦呢?用const const int...

C語言 const 用法

1 const int a int const a 這兩個寫法是等同的,表示a是乙個int常量。2 const int a int const a 表示a是乙個指標,可以任意指向int常量或者int變數,它總是把它所指向的目標當作乙個int常量。3 int const a 表示a是乙個指標常量,初始...

const常見用法

const用法主要是防止定義的物件再次被修改,定義物件變數時要初始化變數 下面我就介紹一下幾種常見的用法 1.用於定義常量變數,這樣這個變數在後面就不可以再被修改 const int val 10 val 20 錯誤,不可被修改 2.保護傳參時引數不被修改,如果使用引用傳遞引數或按位址傳遞引數給乙個...