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

2021-09-28 11:36:06 字數 3539 閱讀 4459

你知道我們宣告乙個變數時象這樣int i ;這個i是可能在它處重新變賦值的。如下:

int i =0;

/* . . . */

i =20;

/*這裡重新賦值了*/

不過有一天我的程式可能需要這樣乙個變數(暫且稱它變數),在宣告時就賦乙個初始值。之後我的程式在其它任何處都不會再去重新對它賦值。那我又應該怎麼辦呢?用const 。

/* . . . */

const

int ic =20;

/* . . . */

ic =40;

/*這樣是不可以的,編譯時是無法通過,因為我們不能對const 修飾的ic重新賦值的。*/

/*這樣我們的程式就會更早更容易發現問題了。*/

/* . . . */

有了const修飾的ic 我們不稱它為變數,而稱符號常量,代表著20這個數。這就是const 的作用。ic是不能在它處重新賦新值了。

認識了const 作用之後,另外,我們還要知道格式的寫法。有兩種:

const

int ic =

20;

int

const ic =

20;

它們是完全相同的。這一點我們是要清楚。總之,你務必要記住const 與int哪個寫前都不影響語義。有了這個概念後,我們來看這兩個傢伙:

const

int*pi

int

const

*pi

按你的邏輯看,它們的語義有不同嗎?呵呵,你只要記住一點:int 與const 哪個放前哪個放後都是一樣的,就好比const int ic;與int const ic;一樣。也就是說,它們是相同的。

好了,我們現在已經搞定乙個「雙包胎」的問題。那麼

int *const pi;

與前兩個語句又有什麼不同呢?***就來具體分析它們的格式與語義吧!

我先來說說const int *pi是什麼作用 (當然int const *pi也是一樣的,前面我們說過,它們實際是一樣的)。看下面的例子:

/* **開始 */

int i1 =30;

int i2 =40;

const

int*pi =

&i1;

pi =

&i2;

/* 注意這裡,pi可以在任意時候重新賦值乙個新記憶體位址*/

i2 =80;

/* 想想看:這裡能用*pi = 80來代替嗎?當然不能!*/

printf

("%d\n"

,*pi)

;/* 輸出是80 */

/* **結束 */

首先const 修飾的是整個*pi(注意,我寫的是*pi而不是pi)。所以*pi是常量,是不能被賦值的(雖然pi所指的i2是變數,不是常量)。

其次,pi前並沒有用const 修飾,所以pi是指標變數,能被賦值重新指向另一記憶體位址的。你可能會疑問:那我又如何用const 來修飾pi呢?其實,你注意到int *const pi中const 的位置就大概可以明白了。請記住,通過格式看語義。哈哈,你可能已經看出了規律吧?

確實,int *const pi與前面的int const *pi會很容易給混淆的。注意:前面一句的const 是寫在pi前和號後的,而不是寫在pi前的。很顯然,它是修飾限定pi的。我先讓你看例子:

/* **開始 */

int i1 =30;

int i2 =40;

int*

const pi =

&i1;

/* pi = &i2; 注意這裡,pi不能再這樣重新賦值了,即不能再指向另乙個新位址。(第4行的注釋)*/

/* 所以我已經注釋了它。*/

i1 =80;

/* 想想看:這裡能用 *pi = 80; 來代替嗎?可以,這裡可以通過*pi修改i1的值。(第5行的注釋)*/

/* 請自行與前面乙個例子比較。 */

printf

("%d"

,*pi)

;/* 輸出是80 */

/* **結束 */

語義分析:

看了這段**,你明白了什麼?有沒有發現pi值是不能重新賦值修改了。它只能永遠指向初始化時的記憶體位址了。相反,這次你可以通過*pi來修改i1的值了。與前乙個例子對照一下吧!看以下的兩點分析:

1)pi因為有了const 的修飾,所以只是乙個指標常量:也就是說pi值是不可修改的(即pi不可以重新指向i2這個變數了)(請看第4行的注釋)。

2)整個*pi的前面沒有const 的修飾。也就是說,*pi是變數而不是常量,所以我們可以通過*pi來修改它所指記憶體i1的值(請看第5行的注釋)。

總之一句話,這次的pi是乙個指向int變數型別資料的指標常量。

我最後總結兩句:

1) 如果const 修飾在*pi前,則不能改的是*pi(即不能類似這樣:*pi=50;賦值)而不是指pi。

2) 如果const 是直接寫在pi前,則pi不能改(即不能類似這樣:pi=&i;賦值)。

請你務必先記住這兩點,相信你一定不會再被它們給搞糊了。

這裡,我再補充以下三種情況。其實只要上面的語義搞清楚了,這三種情況也就已經被包含了。不過作為三種具體的形式,我還是簡單提一下吧!

情況一:int *pi指標指向const int i常量的情況

/* begin */

const

int i1 =40;

int*pi;

pi =

&i1;

/* 這樣可以嗎?不行,vc下是編譯錯。*/

/* const int 型別的i1的位址是不能賦值給指向int 型別位址的指標pi的。否則pi豈不是能修改i1的值了嗎!*/

pi =

(int*)

&i1;

/* 這樣可以嗎?強制型別轉換可是c所支援的。*/

/* vc下編譯通過,但是仍不能通過 *pi = 80來修改i1的值。去試試吧!看看具體的怎樣。*/

/* end */

情況二:const int *pi指標指向const int i1的情況

/* begin */

const

int i1=40;

const

int* pi;

pi=&i1;

/* 兩個型別相同,可以這樣賦值。很顯然,i1的值無論是通過pi還是i1都不能修改的。 */

/* end */

情況三:用const int *const pi宣告的指標

/* begin */

int i;

const

int*

const pi=

&i;/*你能想象pi能夠作什麼操作嗎?pi值不能改,也不能通過pi修改i的值。因為不管是*pi還是pi都是const的。 */

/* end */

C語言中const的用法

1 const的普通用法 const int n 10 意思很明顯,n是乙個唯讀變數,程式不可以直接修改其值。這裡還有乙個問題需要注意,即如下使用 int a n 在ansi c中,這種寫法是錯誤的,因為陣列的大小應該是個常量,而n只是乙個變數。2 const用於指標 const int p int...

C語言中const的用法

關鍵字const用來定義常量,如果乙個變數被const修飾,那麼它的值就不能再被改變,我想一定有人有這樣的疑問,c語言中不是有 define嗎,幹嘛還要用const呢,我想事物的存在一定有它自己的道理,所以說const的存在一定有它的合理性,與預編譯指令相比,const修飾符有以下的優點 1 預編譯...

C語言中const的用法

const是c語言中的關鍵字,用來定義常變數。1 在使用const時有以下規則 const將變數變為唯讀。只有讀許可權,沒有寫許可權 資料型別對const無影響。如以下兩種定義無區別 int const a 10 不管const是在int前或後,都無影響。const int a 10 都對整形變數a...