C C 中const關鍵字相關

2021-08-19 13:36:27 字數 2672 閱讀 9414

ansi c 允許使用const關鍵字來宣告「常量」,const「常量」和普通變數一樣,只是它們的值不能修改。該處「常量」加引號的原因是,const變數只是read-only,不能修改其值,的普通變數,只能用於允許使用變數的地方。故在編譯器沒有進行常量摺疊的時候(一般的c語言編譯器,也有其他的可以定義陣列),不能用來定義陣列長度。

int   const a = 10;

const int a = 10;

這兩種宣告都是一樣的,const變數需要在宣告的時候定義。

/*1*/int   const   *pci;//指向整型常量的指標,可以修改指標的值,但是不能修改它所指向的值
/*2*/int   * const  cpi;//指向整型的常量指標,指標是常量,可其值不能修改,但可以修改它所指向的值
區別的方式是,在宣告中重點看const右邊的值:在1中,const 右邊是*pci,修飾的是指標取值後結構(其結構的型別為int),故為指標指向的值不能修改;在2中,const右邊是cpi,修飾的是指標(指標型別為int *),故指標的值不能修改。

關鍵字const並不能把變數變成常量!在乙個符號前面加上const限定符只是表示這個符號不能被賦值。也就是它的值對於這個符號來說是唯讀的,但是它並不能防止通過程式的內部(甚至外部)的方法來修改這個值。

如下**所示,const int *limitp宣告limit所指向的值不能修改,對其所指向的值進行賦值將導致出錯。

#include //使用code::blocks 12.11 gun gcc complier 編譯.cppwenjia

int main()

但是可以,修改指標指向的值來修改指標解引用的值:

#include //使用code::blocks 12.11 gun gcc complier 編譯.cpp檔案

int main()

更奇葩的是,在一些型別轉換檢測不嚴格的編譯其中,不僅可以修改*limitp指標指向何處,甚至可以改變limit的值,如下所示:

#include //使用code::blocks 12.11 gun gcc complier 編譯.c檔案

int main()

編譯器只是報了乙個警告,在執行後,發現limit和*limitp的值都為0!

使用code::blocks 12.11 gun gcc complier 編譯.cpp檔案時,編譯會在上述地方報錯:

#include //使用code::blocks 12.11 gun gcc complier 編譯.c檔案

int main()

由於gun gcc complier 編譯.c檔案時,對型別轉換檢測不嚴格,故使用gun gcc complier 編譯.cpp檔案進行驗證與分析。此外,根據上述分析,了解專案使用的編譯器,以及分析編譯彈出的任何警告訊息都顯得很重要。

const最有用之處就是用他來限定函式的形參,這樣該函式將不會修改實參指標所指的資料,也許就是c和c++中const最一般的用法。

在ansic標準的第6.3.2.2節中,有這麼一句話「每個實參都應該具有自己的型別,這樣它的值就可以賦值給與它所對應的形參型別的物件中(該物件的型別不能含有限定符)。」也就是說,引數傳遞的過程類似於賦值。 在ansic標準的第6.3.16.1節中描述了賦值合法的約束條件:「兩個運算元都是指向有限定符或無限定符的相容型別的指標,左邊指標所指向的型別必須具有右邊指標所指向型別的全部限定符」

正是這個條件,使得函式呼叫中實參char *能夠與形參const char *(在c標準庫中,所有的字串處理函式就是這樣的。)它之所以合法,是應為在下面的**中:

const char *ccp;

char *cp;

ccp = cp;

下面的**,展示了實參和形參型別不相容時,引數傳遞不成功的情形:

#include //使用code::blocks 12.11 gun gcc complier 編譯.c檔案

void foo(const char **ccp){};

int main()

const char ** ccp是乙個指向 「有const限定符的char型別指標」的指標,指向const char *

char ** cp是乙個指向 「char型別指標」的指標,                         指向 char *

故他們指向的型別是不相容的,引數傳遞會失敗。

下面的**同理:

void foo(char **cp){};

int main()

3.const儲存型別

const修飾的全域性變數存放在常量區;區域性變數被const修飾後仍存放在棧區,僅僅意味著在表示式上不能顯式地改變該變數值,否則編譯器會報語法錯誤。)。

有關變數的儲存型別的詳細資料,請參看:

**c語言的資料儲存(一):

**c語言的資料儲存(二) :

c語言bss,data,text,rodata,堆,棧,常量段

C C 中const關鍵字

const經常被用到,所以今天總結一下const關鍵字的用法,常用的場景為修飾變數 c c 不同 修飾指標和引用,修飾函式引數,修飾函式返回值,修飾函式定義體 類 成員函式 1 修飾變數 cosnt在修飾變數時,在c和c 中是不同的。const int a 5 intarray a 在c語言中是錯誤...

C C 中const關鍵字詳解

1 問題描述 2 解答 不用死記!理解記憶 遇到const修飾的時候,從右向左讀 最容易區分 如 const int p1 則const 修飾的是int p1說明這個變數是不能變的,就是p1所指向的變數是常量變數 int const p2 i const修飾的是 p2 表示所指向的變數 說明p2所指...

C C 中 const 關鍵字用法總結

首先,來看看const的基本含義。在 c c 語言中,const關鍵字是一種修飾符。所謂 修飾符 就是在編譯器進行編譯的過程中,給編譯器一些 要求 或 提示 但修飾符本身,並不產生任何實際 就 const 修飾符而言,它用來告訴編譯器,被修飾的這些東西,具有唯讀的特點。在編譯的過程中,一旦我們的 試...