C語言中const關鍵字的用法

2021-08-08 21:52:31 字數 4653 閱讀 1277

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

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

2、可以保護被修飾的東西,防止意外修改,增強程式的健壯性

3、編譯器通常不為普通const常量分配儲存空間,而是將它們儲存在符號表中,這使得它成為乙個編譯期間的常量,沒有了儲存與讀記憶體的操作,使得它的效率也很高。

補充:const

是通過編譯器在編譯的時候執行檢查來確保實現的(也就是說

const

型別的變數不能改是編譯錯誤,不是執行時錯誤)。

下面我們從幾個方面來說一下const的用法:

一、修飾區域性變數

const int n=5;

int const n=5;

const char* str="fdsafdsa";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 int* const p;void stringcopy(char *strdestination, const char *strsource);void swap ( int * const p1 , int * const p2 )例如函式

const char * getstring(void);char *str = getstring();const char *str = getstring();補充:

/*gcc中,

const

是通過編譯器在編譯的時候執行檢查來確保實現的(也就是說

const

型別的變數不能改是編譯錯誤,不是執行時錯誤。)所以我們只要想辦法騙過編譯器,就可以修改

const

定義的常量,而執行時不會報錯。*/int main(int argc, char

const

*argv){ /*

const

int a; / int

const

a; 有一樣的意思 如果我們給出

const

int a;你應該知道這是將a常量化了,但是為什麼那? 那是因為int 和

const

都作為乙個型別限定詞,有相同的地位。 所以你也可以寫成 int

const

a;似乎這樣更加好理解!當然這都不難, 難點在**哪?當然此時你如果定義指標也是可以修改的,但是會報警告! 當然強制型別轉換後警告也不會報了! 所以

const

int a=

10; 是申明了乙個只可讀的變數,如果 a=

12;在編譯期報錯。 */

/*1、申明乙個常變數*/

const

int a=

10;

/* a =12; 變異錯誤,a是編譯期常量 */

int b=

10,c=

55; /*2

、 申明乙個指標, 該指標指向的變數不可更改 ,相當於通過*p指標獲得了原來例項的可讀版本

一般用於子函式呼叫中形參函式,限制子函式中不能對呼叫放內容進行更改

如 const

char* src; 或 char

const

*src;

*p是常量。也就是說,p指向的資料是常量

const

int* p int

const

*p;

const

int* p; 這是修飾了誰那?其實我們可以這樣想,如果我們把int 拿出來

也就是

const

int (*p); 等價於 int

const

(*p); 由此我們可以看出來

const

修飾了*p啊!

也就是指向的內容不可以改變,比如p已經指向a變數,但是*p=

45;會報錯,因為*p不可改變

但是位址是可以改變的。比如c=

55, p=&c;是正確的 但是我們如果寫為int

const

*p 似乎就非常好理解了。就是修飾了*p */

const

int* p=&a;

/* *p=45; 會報錯 */

p=&c;

//正確做法

//*p=

445; 不可更改

c=43534;//

通過原來變數名可更改,相當於通過p指標獲得了c變數的可讀版本

int

const

*ptr=&b;

/* *ptr=44; *ptr 是不可更改 */

/* 3

、 申明乙個常指標變數 也就是說 該指標你只能賦值一次, 且只能在定義時候賦值 ; 但是指標指向的變數可以改變

int *

const

p; */ int*

const

ptr2=&b;

*ptr2=

3454

; fprintf(stdout,

"%d\n"

, *ptr2 );

/* 4

、 const

int *

const

p 表示p指標是乙個常指標變數,同時指向的變數也是常量不可更改

*/ const

int *

const

ptr3=&c;

/* ptr3=&a; 錯誤,ptr3 是常指標變數, 唯讀的 */

/* *ptr3=80; 錯誤,*ptr3 是常量不可更改,唯讀的 */

return0;

這兩種寫法是一樣的,都是表示變數n的值不能被改變了,需要注意的是,用const修飾變數時,一定要給變臉初始化,否則之後就不能再進行賦值了。

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

如果沒有const的修飾,我們可能會在後面有意無意的寫str[4]=』x』這樣的語句,這樣會導致對唯讀記憶體區域的賦值,然後程式會立刻異常終止。有了const,這個錯誤就能在程式被編譯的時候就立即檢查出來,這就是const的好處。讓邏輯錯誤在編譯期被發現。

二、常量指標與指標常量

常量指標是指標指向的內容是常量,可以有一下兩種定義方式。

需要注意的是一下兩點:

1、常量指標說的是不能通過這個指標改變變數的值,但是還是可以通過其他的引用來改變變數的值的。

2、常量指標指向的值不能改變,但是這並不是意味著指標本身不能改變,常量指標可以指向其他的位址。

指標常量是指指標本身是個常量,不能在指向其他的位址,寫法如下:

需要注意的是,指標常量指向的位址不能改變,但是位址中儲存的數值是可以改變的,可以通過其他指向改位址的指標來修改。

區分常量指標和指標常量的關鍵就在於星號的位置,我們以星號為分界線,如果const在星號的左邊,則為常量指標,如果const在星號的右邊則為指標常量。如果我們將星號讀作『指標』,將const讀作『常量』的話,內容正好符合。int const * n;是常量指標,int *const n;是指標常量。

指向常量的常指標

是以上兩種的結合,指標指向的位置不能改變並且也不能通過這個指標改變變數的值,但是依然可以通過其他的普通指標改變變數的值。

三、修飾函式的引數

根據常量指標與指標常量,const修飾函式的引數也是分為三種情況

1、防止修改指標指向的內容

其中 strsource 是輸入引數,strdestination 是輸出引數。給 strsource 加上 const 修飾後,如果函式體內的語句試圖改動 strsource 的內容,編譯器將指出錯誤。

2、防止修改指標指向的位址

指標p1和指標p2指向的位址都不能修改。

3、以上兩種的結合。

四、修飾函式的返回值

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

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

正確的用法是

五、修飾全域性變數

全域性變數的作用域是整個檔案,我們應該盡量避免使用全域性變數,以為一旦有乙個函式改變了全域性變數的值,它也會影響到其他引用這個變數的函式,導致除了bug後很難發現,如果一定要用全域性變數,我們應該盡量的使用const修飾符進行修飾,這樣方式不必要的以為修改,使用的方法與區域性變數是相同的

C語言中const關鍵字的用法

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

C語言中const關鍵字的用法

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

C語言中const關鍵字

c語言中const關鍵字是constant的縮寫,翻譯為常量,常數的意思,主要作用如下 c語言中使用const修飾變數,主要是對變數宣告為唯讀特性,並保護變數以防止被修改。例如 const i 5 變數i只具有唯讀特性,不能夠被更改,若想重新對i進行賦值,如i 10 是不可行的。c語言中const還...