ANSIC型別限定符

2021-10-03 07:15:03 字數 2826 閱讀 6569

以const型別關鍵字宣告的物件,其值不能通過賦值來遞增,遞減來修改。

以下**:

const

int a =12;

//限定a的值不能修改

a =12

;//不可以

編譯器會報錯,但是可以初始化變數,因此下面的**沒問題:

const

int a =12;

//沒問題

該宣告讓a成為唯讀變數。初始化後,就不能改變它的值。

可以用const關鍵字建立不允許修改的陣列:

const

int days=

;

宣告普通變數和陣列時使用const關鍵字很簡單。指標則複雜一點,因為要區分是限定指標本身為const還是限定指向的值為const。下面的宣告:

const

float

*pf;

//pf指向乙個float型別的const值

建立了pf指向的值不能被改變,而pf本身的值可以改變。例如,可以設定該指標指向其它const值,相比之下,下面的宣告:

float

*const pt;

//pt是乙個const指標

const

*float

*const ptr;

表明ptr既不能指向別處,它所指向的值也不能改變。

還可以把const放在第三個位置:

float

const

*pfc;

//與const float *pfc等價

總結:

把const放在型別名後,*之前,說明該指標不能改變它所指向的值。

簡而言之,const放在*左側的任意位置,限定了指標指向的資料不能改變;

const放在*的右側,限定了指標本身不能改變

const關鍵字的常見用法是宣告為函式形參的指標。例如,假設有乙個函式要呼叫display()顯示乙個陣列的內容。要把陣列名作為實際引數傳遞給該函式,但是陣列名是乙個位址。該函式可能會更改主調函式的資料,但是下面的原型保證了資料不會被修改:

void

display

(const

int arry ,

int limit)

;

順帶一提,當陣列名作為實參傳遞時,形參可以是以下幾種形式:

一維陣列:

int arry[

]

與下面等價:

int

*arry

二維陣列:

int arry[

][colums]

;

與下面等價:

int

*(arry)

[colums]

因為乙個中括號表明是乙個指標。

使用全域性變數是一種冒險的方法,因為這樣做暴露了資料,程式的任何部分都能更改資料,但如果把資料設定為const,就可以避免這樣的危險,因此使用const限定符宣告全域性變數很合理,然而,在檔案間共享const要小心,可以採用兩個策略:

在乙個檔案中採用定義式宣告,另乙個檔案採用引用式宣告:

/*file1.c---定義了一些外部const變數*/

const

double pi =

3.1415926

;const

char

*months [12]

=;/*file2.c---使用定義在別處的外部const變數*/

extern

const

double pi;

extern

const

char

*months[

];

const變數放在另乙個標頭檔案中,然後在其它標頭檔案中包含該標頭檔案:

/*constant.h--定義了一些外部const變數*/

static

const

double pi =

3.1415926

;static

const

char

* months =

;/*file1.c---使用定義在別處的外部const變數*/

#include

"constant.h"

/*file2.c---使用定義在別處的外部const變數*/

#include

"constant.h"

這種方案必須在標頭檔案中使用關鍵字static宣告全域性變數。如果去掉static,那麼在file1.cfile2.c中包含constant.h將導致每個檔案中都有乙個相同識別符號的定義式宣告,實際上,這種方法為每個檔案提供了乙個單獨的資料副本,每個副本只對該檔案可見,所以無法用這些資料與其它檔案通訊,不過他們是完全相同的。

11 3 ANSI C型別限定符

這篇說一下2個關鍵字 const,volatile.內容在書12.5章.以const宣告的物件,值不能通過賦值或遞增遞減來修改,比如下面的 就是不合法的.1 const int ci 100 ci 10 2 const char cc cc c 但是這樣是合理的 const int i 32 對於指...

linux volatile型別限定符

背景 一直會有意無意的看到有這個volatile,但是做為乙個在linux應用層寫了幾年 的程式設計師,還真的沒有搞懂什麼時候需要這樣用?查了一圈,網上都是各種告訴編譯器不要把該變數放到暫存器,放到暫存器,如果其它地方改了拿不到最新的值,不要優化等等 首先說下,組合語言真的屬於基本不會那種。多執行緒...

C C volatile型別限定符

volatile 限定符告知計算機,而不是變數所在的程式 可以改變該變數的值。通常,它被用於硬體位址以及在其他程式或同時執行的執行緒中共享資料。例如,乙個位址上可能儲存著當前的時鐘時間,無論程式做什 麼,位址上的值都隨時間的變化而改變。或者乙個位址用於接受另一台計算 機傳入的資訊。volatile的...