版權(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 安全分娩制度
- 2026年市場營銷策略市場總監(jiān)考試題庫大全
- 2026年古代詩詞賞析與填空題目全解全析
- 2026年企業(yè)人力資源分析師技能筆試
- 2026年食品安全管理專業(yè)筆試模擬題
- 2026年公關(guān)人員行為規(guī)范與廣告法知識測試題
- 2026年金融衍生品投資與風(fēng)險管理題庫
- 2026年心理咨詢師職業(yè)能力測試題及答案解析
- 2026年網(wǎng)絡(luò)安全技術(shù)防護(hù)與應(yīng)急響應(yīng)題集
- 2026年中小學(xué)教師招聘考試教育心理學(xué)試題
- ESG理論與實務(wù) 課件 第7-12章 ESG 信息披露- ESG的全球行動
- 初中數(shù)學(xué)教學(xué)經(jīng)驗分享課件
- (已壓縮)國民體質(zhì)測定標(biāo)準(zhǔn)(2023年修訂)
- 《軍品價格管理辦法》
- 文旅領(lǐng)域安全知識培訓(xùn)課件
- 分包商引進(jìn)管理辦法
- 腸脂垂炎的超聲診斷與臨床管理
- 行業(yè)特定市場調(diào)研方法與技巧分享
- 護(hù)理翻身叩背課件
- HY/T 0460.4-2024海岸帶生態(tài)系統(tǒng)現(xiàn)狀調(diào)查與評估技術(shù)導(dǎo)則第4部分:鹽沼
- 智能客戶服務(wù)實務(wù)(第三版)課件 項目二 開展智能化客戶服務(wù)管理規(guī)劃
評論
0/150
提交評論