C語言const關(guān)鍵字的用法_第1頁
C語言const關(guān)鍵字的用法_第2頁
C語言const關(guān)鍵字的用法_第3頁
C語言const關(guān)鍵字的用法_第4頁
C語言const關(guān)鍵字的用法_第5頁
已閱讀5頁,還剩2頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

第第頁C語言const關(guān)鍵字的用法

const基本介紹

const是constant的簡寫,用來定義常量,如果一個變量被const修飾,那么它的值就不能再被改變。

const與define的區(qū)別

1、define是預(yù)編譯指令,定義的宏是在預(yù)處理階段展開的,而const是普通變量的定義,是只讀變量,且是在編譯運行階段使用的。

2、define定義的是常量,define定義的宏在編譯后消失了,它不占用內(nèi)存,而const定義的常變量本質(zhì)上仍然是一個變量,具有變量的基本屬性,有類型、占用存儲單元,除了不能作為數(shù)組的長度,用const定義的常變量具有宏的優(yōu)點,而且使用更方便。

3、define定義的對象沒有數(shù)據(jù)類型,編譯器只能(機(jī)械)地進(jìn)行字符替換,沒有類型安全檢查,即會出現(xiàn)“邊際問題”或者是“括號問題”。而const定義的是變量,有數(shù)據(jù)類型。

const作用

1、可以用來修飾變量,修飾函數(shù)參數(shù),修飾函數(shù)返回值,且被const修飾的東西,都受到強(qiáng)制保護(hù),可以預(yù)防其它代碼無意識的進(jìn)行修改,從而提高了程序的健壯性(是指系統(tǒng)對于規(guī)范要求以外的輸入能夠判斷這個輸入不符合規(guī)范要求,并能有合理的處理方式。ps:即所謂高手寫的程序不容易死);

2、使編譯器保護(hù)那些不希望被修改的參數(shù),防止無意代碼的修改,減少bug;

3、增強(qiáng)代碼的可讀性,給讀代碼的人傳遞有用的信息,聲明一個參數(shù),是為了告訴用戶這個參數(shù)的應(yīng)用目的。

const用法介紹

1、修飾局部變量、全局變量及字符串常量

示例代碼:

#include

#include#include

const

int

a

=

10;

//const修飾的全局變量放在常量區(qū)//1.const修飾的全局變量,即使語法通過,但是運行的時候會受到常量區(qū)的保護(hù),段錯誤,運行失敗void

(te)st01(){

//a

=

100;

//直接修改語法不通過

int

*p

=

*p

=

100;

//間接修改語法通過,運行時產(chǎn)生段錯誤

printf("a

%d",a);}//2.const修飾的局部變量void

test02(){

const

int

b

=

10;

//分配到棧上

//b

=

100;

//直接修改語法不通過

//(c語言)下稱為偽常量

int

*p

=

*p

=

100;

printf("b

%d",*p);

//間接修改成功

//int

a[b];

偽常量是不可以初始化數(shù)組的}

//3.字符串常量void

test03(){

char

*p1

=

"hello

w(or)ld";

char

*p2

=

"hello

world";

char

*p3

=

"hello

world";

printf("%s",p1);

printf("%s",

p2);

printf("%s",

p3);

printf("%s",

//四個輸出的結(jié)果一樣

//p1[0]

=

'z';

//不允許修改字符串常量

printf("p1[0]

%c",p1[0]);

//可以輸出}

int

main(){//

test01();//

test02();

test03();

return

0;}

const修飾的普通變量:定義的時候就要給它賦初值,之后哪怕是賦相同值都不行。const修飾的局部變量還是變量,直接修改編譯器報錯,可以間接修改,存放在棧區(qū),代碼塊結(jié)束時釋放。

const修飾全局變量:直接修改編譯器報錯,間接修改編譯器也許會通過,但運行時會報錯(段錯誤)。const修飾的全局變量存放在全局(靜態(tài))存儲區(qū),編譯期最初將其保存在符號表中,第一次使用時為其分配內(nèi)存,在程序結(jié)束時釋放。

const修飾字符串常量:字符串常量位于文字常量區(qū)(也有文章歸類于代碼區(qū)),本身就不允許被修改,如果沒有const的修飾,我們可能會在后面有意無意的修改字符串常量,這樣會導(dǎo)致對只讀內(nèi)存區(qū)域的賦值,然后程序會立刻異常終止。有了const,這個錯誤就能在程序被編譯的時候就立即檢查出來,這就是const的好處。讓邏輯錯誤在編譯期被發(fā)現(xiàn)。

2、修飾指針

常量指針和指針常量傻傻分不清楚,以下方法幫助你來區(qū)分二者:區(qū)分常量指針和指針常量的關(guān)鍵就在于星號的位置,我們以星號為分界線。

如果const在星號的左邊,則為常量指針

如果const在星號的右邊則為指針常量

如果我們將星號讀作‘指針’,將const讀作‘常量’的話,內(nèi)容正好符合。

intconst*num;是常量指針,就是*num指向的數(shù)據(jù)不可以改,num指向的地址可以修改,

intconstnum;是指針常量,就是num指向的地址不可以修改,num指向的數(shù)據(jù)可以修改。

代碼示例:

//第一種,常量指針const

int

*p1;

//p本身不是const的,而p指向的變量是constint

const

*p2;

//p本身不是const的,而p指向的變量是const#include

int

main(){

int

a

=

5;

int

b

=

20;

const

int

*p

=

//

*p

=

100;

//編譯器報錯

p

=

//完全可以

printf("%d",*p);

//間接修改成功

return

0;}

需要注意的是以下兩點:

1、常量指針說的是不能通過這個指針改變變量的值,但是還是可以通過其他的方式來改變變量的值的。

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

//第二種,指針常量int*

const

p3;

//p本身是const的,而p指向的變量不是const#include

int

main(){

int

a

=

5;

int

b

=

20;

int

*p

=

int*

const

n

=

//

n

=

//error:

assignment

of

re(ad)-only

variable

‘n’

*p

=

8;

printf("%d",a);

return

0;}

指針常量是指指針本身是個常量,不能在指向其他的地址,需要注意的是,指針常量指向的地址不能改變,但是地址中保存的數(shù)值是可以改變的,可以通過其他指向該地址的指針來修改。

//第三種const

int*

const

p4;

//p本身是const的,而p指向的變量也是const

是以上兩種的結(jié)合,指針指向的位置不能改變并且也不能通過這個指針改變變量的值,但是依然可以通過其他的普通指針改變變量的值。

修飾函數(shù)的參數(shù)

const修飾參數(shù)是為了防止函數(shù)體內(nèi)可能會修改參數(shù)原始對象。因此,有三種情況可討論:

1、函數(shù)參數(shù)為值傳遞:

值傳遞(pass-by-value)是傳遞一份參數(shù)的拷貝給函數(shù),因此不論函數(shù)體代碼如何運行,也只會修改拷貝而無法修改原始對象,這種情況不需要將參數(shù)聲明為const。例如:voidfunc(intx)不用寫成voidfunc(constintx)

2、函數(shù)參數(shù)為指針:

指針傳遞(pass-by-pointer)只會進(jìn)行淺拷貝,拷貝一份指針給函數(shù),而不會拷貝一份原始對象。根據(jù)上面對指針常量、常量指針等討論,同樣分為三種情況:

2.1防止修改指針指向的內(nèi)容

典型C庫函數(shù):char*strcpy(char*dest,constchar*src);

2.2防止修改指針指向的地址

voidswap(int*constp1,int*constp2);指針p1和指針p2指向的地址都不能修改。

2.3防止修改指針指向的內(nèi)容和地址

4.修飾函數(shù)的返回值

1、如果函數(shù)返回值采用“值傳遞方式”,由于函數(shù)會把返回值復(fù)制到外部臨時的存儲單元中,加const修飾沒有任何價值。例如把函數(shù)intGetInt(void)寫成constintGetInt(void)是沒有意義的。

2、如果給以“指針傳遞”方式的函數(shù)返回值加co

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論