作為乙個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.保護傳參時引數不被修改,如果使用引用傳遞引數或按位址傳遞引數給乙個...