C語言中const關鍵字的用法

關鍵字const用來定義常量,若是一個變量被const修飾,那麼它的值就不能再被改變,我想必定有人有這樣的疑問,C語言中不是有#define嗎,幹嗎還要用const呢,我想事物的存在必定有它本身的道理,因此說const的存在必定有它的合理性,與預編譯指令相比,const修飾符有如下的優勢:函數

一、預編譯指令只是對值進行簡單的替換,不能進行類型檢查指針

二、能夠保護被修飾的東西,防止意外修改,加強程序的健壯性內存

三、編譯器一般不爲普通const常量分配存儲空間,而是將它們保存在符號表中,這使得它成爲一個編譯期間的常量,沒有了存儲與讀內存的操做,使得它的效率也很高。作用域

下面咱們從幾個方面來講一下const的用法:字符串

1、修飾局部變量編譯器

const int n=5;
int const n=5;io

這兩種寫法是同樣的,都是表示變量n的值不能被改變了,須要注意的是,用const修飾變量時,必定要給變臉初始化,不然以後就不能再進行賦值了。編譯

接下來看看const用於修飾常量靜態字符串,例如:效率

const char* str="fdsafdsa";變量

若是沒有const的修飾,咱們可能會在後面有意無心的寫str[4]=’x’這樣的語句,這樣會致使對只讀內存區域的賦值,而後程序會馬上異常終止。有了const,這個錯誤就能在程序被編譯的時候就當即檢查出來,這就是const的好處。讓邏輯錯誤在編譯期被發現。

2、常量指針與指針常量

常量指針是指針指向的內容是常量,能夠有一下兩種定義方式。

const int * n;
int const * n;

須要注意的是一下兩點:

一、常量指針說的是不能經過這個指針改變變量的值,可是仍是能夠經過其餘的引用來改變變量的值的。

int a=5;
const int* n=&a;
a=6;

二、常量指針指向的值不能改變,可是這並非意味着指針自己不能改變,常量指針能夠指向其餘的地址。

int a=5;
int b=6;
const int* n=&a;
n=&b;

指針常量是指指針自己是個常量,不能在指向其餘的地址,寫法以下:

int *const n;

須要注意的是,指針常量指向的地址不能改變,可是地址中保存的數值是能夠改變的,能夠經過其餘指向改地址的指針來修改。

int a=5;
int *p=&a;
int* const n=&a;
*p=8;

區分常量指針和指針常量的關鍵就在於星號的位置,咱們以星號爲分界線,若是const在星號的左邊,則爲常量指針,若是const在星號的右邊則爲指針常量。若是咱們將星號讀做‘指針’,將const讀做‘常量’的話,內容正好符合。int const * n;是常量指針,int *const n;是指針常量。

指向常量的常指針

是以上兩種的結合,指針指向的位置不能改變而且也不能經過這個指針改變變量的值,可是依然能夠經過其餘的普通指針改變變量的值。

const int* const p;

3、修飾函數的參數

根據常量指針與指針常量,const修飾函數的參數也是分爲三種狀況

一、防止修改指針指向的內容

void StringCopy(char *strDestination, const char *strSource);

其中 strSource 是輸入參數,strDestination 是輸出參數。給 strSource 加上 const 修飾後,若是函數體內的語句試圖改動 strSource 的內容,編譯器將指出錯誤。

二、防止修改指針指向的地址

void swap ( int * const p1 , int * const p2 )

指針p1和指針p2指向的地址都不能修改。

三、以上兩種的結合。

4、修飾函數的返回值

若是給以「指針傳遞」方式的函數返回值加 const 修飾,那麼函數返回值(即指針)的內容不能被修改,該返回值只能被賦給加const 修飾的同類型指針。 
例如函數

const char * GetString(void);

以下語句將出現編譯錯誤:

char *str = GetString();

正確的用法是

const char *str = GetString();

5、修飾全局變量

全局變量的做用域是整個文件,咱們應該儘可能避免使用全局變量,由於一旦有一個函數改變了全局變量的值,它也會影響到其餘引用這個變量的函數,致使除了bug後很難發現,若是必定要用全局變量,咱們應該儘可能的使用const修飾符進行修飾,這樣防止沒必要要的人爲修改,使用的方法與局部變量是相同的。  

相關文章
相關標籤/搜索