我們通常用型別和儲存類別來描述乙個變數。c90還增加了兩個屬性:恆常性(constancy)和易變性(volatility)。這兩個屬性分別用關鍵字const和volatile來宣告,以這兩關鍵字建立的型別是限定型別。c99標準新增了第3個限定符:restrict,用於提高編譯器優化。c11新增了第四個限定符:_atomic。c11提供了乙個可選庫,由stdatomic.h管理,以支援併發程式設計,而且 _atomic是可選支援項。c99為型別限定符增加了乙個新屬性:它們現在是冪等的(idempotent),其實意思就是可以在一條宣告中多次使用同乙個限定符,多餘的限定符將被忽略:
const
const
const
int n=6;
//與const int n= 6;相同
以const關鍵字宣告的物件,其值不能通過賦值或遞增、遞減來修改。在ansi相容的編譯器中,以下**:
const
int nochange;
//限定nochange的值不能被修改
nochange=12;
//不允許
以上**,編譯器會報錯。但是,可以初始化const變數。因此下面的**沒有問題:
const
int nochange=12;
//沒有問題
該宣告讓nochange成為唯讀變數。初始化後,就不能改變它的值。
const
float
* p1;
/*p1指向乙個float型別的const值,指標pf指向的值不能被改變,但是p1指標本身的值可以改變y.另外,與float const * p1;相同*/
float
*const p2;
/*p2是乙個const指標,指標p2本身的值不能更改,但它所指向的值可以改變*/
float
const
*const p3;
/*表明p2既不能指向別處,它所指向的值也不能改變*/
如注釋,把const放在型別之後、*之前,說明指標不能用於改變它多指向的值。簡而言之,const 放在*的左側任意位置,限定了指標指向的資料不能改變;const放在*的右側,限定了指標本身不能改變。const的常見用法是宣告函式形參的指標。下面保證了陣列不會被改變
void
display
(const
int array,
int limit)
;/*const int array與const int *array相同*/
void
******
(const
char
* s)
;/*宣告表明形式引數s被傳遞給******()函式的值初始化後,******()不能改變s指向的值*/
void
supple
(int
*const pi)
;/*與void supple(int pi[const]);等價。這兩個宣告都表示supple()函式不會改變形參pi*/
使用全域性資料是一種冒險的方法,因為這樣暴露了資料,程式的任何部分都能更改資料。如果把資料設定為const,就可避免這樣的危險,因此,用const宣告全域性資料很合理。可以建立const變數、const陣列和const結構。
然而,在檔案間共享const資料要小心。可以採取兩個策略:
第一,遵循外部變數的常用規則,在乙個檔案中使用定義式宣告,在其他檔案使用引用式宣告(用extern關鍵字)。
另一種方案,把const變數放在乙個標頭檔案中,然後在其他檔案中包含該標頭檔案。這種放方案必須在標頭檔案中使用關鍵字static宣告全域性const變數。如果去掉static,那麼在file1.c和file2.c中包含constant.h將會導致每個檔案中都有乙個相同識別符號的定義式宣告,c標準不允許這樣做(然而,有些編譯器允許這樣做)。實際上,這種方案相當於給每個檔案都提供了乙個單獨的資料副本(注意,以static宣告的檔案作用域變數具有內部鏈結屬性)。由於每個副本只對該檔案可見,所以無法用這些資料和其他檔案通訊。不會沒關係,它們都是完全相同的(每個檔案都包含了相同的標頭檔案)的const資料(宣告時使用了const關鍵字),因此這不是問題。
標頭檔案的好處是,方便你偷懶,不用惦記著在乙個檔案中使用定義式宣告,在其他檔案中使用引用式宣告。所有檔案都只需包含同乙個標頭檔案。但是它的缺點是,資料是重複的。對於簡單的資料而言,這沒有問題,但是如果const資料報含龐大的陣列,就不能視而不見了。
因此,可以用一句話總結,const限定符的作用就是把宣告為const的資料(變數、指標、陣列、結構等)保護起來,它們具有唯讀屬性的,不能被改變。
接下來的部落格將繼續分析volatile、restrict和_atomic型別限定符。
const 型別限定符
1.以const關鍵字宣告的物件,其值不能通過賦值或遞增 遞減來修改。例 const int a 限定a的值不能被修改 a 12 不允許 2.在指標中使用const const float pf pf指向乙個float型別的const,建立了pf指向的值不能更改 float const pt pt是...
C C 型別限定符const
一 const介紹 關鍵字const是c c 中的型別限定符 qualified type 以const關鍵字宣告的物件,其值不能通過賦值或遞增 遞減來修改,但可以初始化const變數。二 用法說明 先來看乙個簡單的例子 include int main int argc,char ar 正如上面的...
C 的const限定符
const限定符總是讓人很頭疼,下面講解一下幾個比較容易混淆的概念 對常量的引用 常量引用 一般情況下,引用的型別要與其所引用的物件的型別一致,其中的例外情況就是,當初始化常量引用時,允許用任意表示式作為初始值,只要改表示式能轉換成引用的型別即可。const int i 1 const int ri...