版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
本文格式為Word版,下載可任意編輯——C語(yǔ)言關(guān)鍵字const用法C語(yǔ)言關(guān)鍵字const用法
導(dǎo)語(yǔ):C是高級(jí)語(yǔ)言,它把高級(jí)語(yǔ)言的根本布局和語(yǔ)句與低級(jí)語(yǔ)言的實(shí)用性結(jié)合起來(lái)。下面就由我為大家介紹一下C語(yǔ)言關(guān)鍵字const用法,接待大家閱讀!
c語(yǔ)言中的constC語(yǔ)言中的const
const是C語(yǔ)言中留存的一個(gè)關(guān)鍵字,用來(lái)定義常量,假設(shè)一個(gè)變量被const修飾,那么它的值就不能被變更。使用符號(hào)常量寫(xiě)出的代碼更輕易維護(hù);一些指針往往是邊讀邊移動(dòng),而不是邊寫(xiě)邊移動(dòng);大量編程模范對(duì)于函數(shù)參數(shù)會(huì)強(qiáng)制要求只讀不寫(xiě),在這些處境下,都需要借助const實(shí)現(xiàn)。
那么有些人會(huì)問(wèn),C語(yǔ)言中不是已經(jīng)存在#define了嗎,為什么還要使用const呢?相比于#define,const修飾符有如下優(yōu)勢(shì):
1.const能夠使編譯器舉行類(lèi)型檢查,而預(yù)編譯指令#define只是簡(jiǎn)樸的對(duì)值舉行替換。
2.const可以養(yǎng)護(hù)被修飾的變量等,防止變量由于意外被修改,從而鞏固程序的剛強(qiáng)性。
3.編譯器通常不為普遍const常量調(diào)配存儲(chǔ)空間,而是將他們保存在符號(hào)表中,這使得它成為了一個(gè)編譯期間的常量,沒(méi)有了存儲(chǔ)于內(nèi)存操作,使得它的效率很高。
const用法
const最常見(jiàn)的用法就是作為數(shù)組的邊界和switch分處境標(biāo)號(hào),分類(lèi)如下:
常變量:const+類(lèi)型說(shuō)明符+變量名
常引用:const+類(lèi)型說(shuō)明符+引用名
常對(duì)象:類(lèi)名+const對(duì)象名
常成員函數(shù):類(lèi)名::fun形參+const
常數(shù)組:類(lèi)型說(shuō)明符+const數(shù)組名[大小]
常量指針:const+類(lèi)型說(shuō)明符*指針名或者類(lèi)型說(shuō)明符+const*指針名
首先提示的是:在常變量(const+類(lèi)型說(shuō)明符+變量名)、常引用(const+類(lèi)型說(shuō)明符+引用名)、常對(duì)象(類(lèi)名+const對(duì)象名)、常數(shù)組(類(lèi)型說(shuō)明符+const數(shù)組名[大小]),const”與“類(lèi)型說(shuō)明符”或“類(lèi)名”(其實(shí)類(lèi)名是一種自定義的類(lèi)型說(shuō)明符)的位置可以互換。如:
12constinta=5;intconsta=5;//等同其實(shí)這種可以很好理解,const只能修飾int(類(lèi)型名或類(lèi)名),所以二者是等同的。
修飾局部變量
12constintn=5;intconstn=5;這兩種寫(xiě)法是一樣的,都是表示變量n的值不能被變更了,需要留神的是,用const修飾變量時(shí),確定要給變量初始化(用來(lái)修飾函數(shù)的形參除外),否那么之后就不能再舉行賦值了。C語(yǔ)言中,const定義的常量是全局的,C++中那么是視聲明位置而定。
接下來(lái)看看const用于修飾常量靜態(tài)字符串,例如:
1constchar*str=fdsafdsa;假設(shè)沒(méi)有const的修飾,我們可能會(huì)在后面有意無(wú)意的寫(xiě)str[4]=’x’這樣的語(yǔ)句,這樣會(huì)導(dǎo)致對(duì)只讀內(nèi)存區(qū)域的賦值,然后程序會(huì)馬上奇怪終止。有了const,這個(gè)錯(cuò)誤就能在程序被編譯的時(shí)候就立刻檢查出來(lái),這就是const的好處。讓規(guī)律錯(cuò)誤在編譯期被察覺(jué)。
常量指針與指針常量
常量指針
常量指針表示一個(gè)指向常量的指針,即該指針指向的內(nèi)容是個(gè)常量(至少該常量指針是這樣認(rèn)為的),可以有如下的定義方式:
12constint*n;intconst*n;需要留神以下兩點(diǎn):
1.常量指針指向的值是不能變更的,但是這不意味指針本身不能變更,常量指針是可以指向其他的地址的。
12345inta=5;intb=6;constint*n=a;intconst*n1=a;n=b;這個(gè)例子中,n和n1是等價(jià)的,都是指向a的一個(gè)常量指針,這時(shí)候有人會(huì)說(shuō),常量指針指向的理應(yīng)是一個(gè)常量吧,但是a并不是一個(gè)常量啊,為什么常量指針仍舊可以指向a呢,這時(shí)候又要留神一下了:
編譯器允許把非const對(duì)象的地址賦給指向const對(duì)象的指針,不允許把一個(gè)const對(duì)象的地址賦給一個(gè)普遍的、非const對(duì)象的指針。
其實(shí)這個(gè)也很好理解,對(duì)于一個(gè)變量,我可以對(duì)你增加束縛,用指向const對(duì)象的指針指向你,這只是意味著我現(xiàn)在認(rèn)為你是常量,不能通過(guò)這個(gè)常量指針對(duì)你舉行修改,但是對(duì)于其次種處境就不一樣了,你本來(lái)是一個(gè)被束縛的常量,假設(shè)用一個(gè)普遍的指針指向你的話(huà),就意味著我認(rèn)為你這個(gè)常量是一個(gè)變量,這樣或許我會(huì)在下面的代碼中,對(duì)你的值舉行修改,對(duì)一個(gè)const常量舉行修改,會(huì)發(fā)生什么,你理應(yīng)明白。
然后回到上面的`代碼,我們將a的地址給了n,然后在下一行又變更了n的值,將b的地址賦給了n,這是沒(méi)有任何問(wèn)題的,由于n只是一個(gè)指針,指向了一個(gè)常量,所以被稱(chēng)為常量指針,它本身仍舊是一個(gè)普遍的指針,對(duì)比特殊的是它所指向的內(nèi)容,而不是它本身。所以它本身的值可以修改,指向不同的內(nèi)容。
2.當(dāng)常量指針指向了一個(gè)變量時(shí),不能通過(guò)這個(gè)常量指針變更變量的值,但是還是可以通過(guò)其他的引用來(lái)變更變量的值的。
123456inta=5;constint*n=a;a=6;//正確*n=7;//錯(cuò)誤,對(duì)于常量指針,不能通過(guò)該指針來(lái)變更所指向的內(nèi)容(即使它所指向的內(nèi)容并不是一個(gè)常量)。int*ni=int*n;*n=100;//正確在n這個(gè)指針眼中,n所指向的內(nèi)容是一個(gè)常量,所以不允許別人通過(guò)n本身對(duì)a舉行修改,但是a本質(zhì)上是一個(gè)變量,所以我們可以直接通過(guò)變量名或者新的普遍指針對(duì)a舉行修改。實(shí)際上,在將程序載入內(nèi)存的時(shí)候,會(huì)有特意的一塊內(nèi)存區(qū)域來(lái)存放常量。但是,上面的a本身不是常量,是存放在?;蛘叨阎械摹N覀円琅f可以修改它的值。而n不能修改指向的值理應(yīng)說(shuō)是編譯器的一個(gè)限制。
指針常量
指針常量是指指針本身是一個(gè)常量,它只能指向一個(gè)固定的地址,不能指向別的地址。寫(xiě)法如下:
1int*constn;和上面的常量指針不一樣,指針常量是指指針本身對(duì)比特殊,而它所指的內(nèi)容并不特殊,因此,指針常量指向的內(nèi)容是可以修改的,可以通過(guò)別的指向該地址的指針舉行修改。如下所示:
1234inta=5;int*p=a;int*constn=a;*p=8;在函數(shù)中,指針常量時(shí)表示不允許將該指針指向其他內(nèi)容:
1234567891011121314voidfunc_02int*constpint*pi=newint100;/*錯(cuò)誤!P是指針常量。不能對(duì)它賦值。*/p=pi;intmainint*p=newint10;func_02p;p;return0;然后看下面的代碼:
12constint*m1=newint10;int*constm2=newint20;在上面的兩個(gè)表達(dá)式中,最輕易讓人迷惑的是const畢竟是修飾指針還是指針指向的內(nèi)存區(qū)域?其實(shí),只要知道:const只對(duì)它左邊的東西起作用,唯一的例外就是const本身就是最左邊的修飾符,那么它才會(huì)對(duì)右邊的東西起作用。根據(jù)這個(gè)規(guī)矩來(lái)判斷,m1理應(yīng)是常量指針(即不能通過(guò)m1來(lái)修改它所指向的內(nèi)容。);而m2理應(yīng)是指針常量(即不能讓m2指向其他的內(nèi)存地址)?;蛘呶覀兛梢园研翘?hào)看做指針,把const看做常量,那么m1就是常量指針,m2就是指針常量。
指向常量的常指針
是以上兩種的結(jié)合,指針指向的位置不能變更并且也不能通過(guò)這個(gè)指針變更變量的值,但是當(dāng)它指向一個(gè)變量時(shí),照舊可以通過(guò)其他的普遍指針變更變量的值。
constint*constp;
修飾函數(shù)的參數(shù)
根據(jù)常量指針與指針常量,const修飾函數(shù)的參數(shù)也是分為三種處境
1.防止修改指針指向的內(nèi)容
1voidStringCopychar*strDestination,constchar*strSource;其中strSource是輸入?yún)?shù),strDestination是輸出參數(shù)。給strSource加上const修飾后,假設(shè)函數(shù)體內(nèi)的語(yǔ)句試圖改動(dòng)strSource的內(nèi)容,編譯器將指出錯(cuò)誤。這種形式通常用于在數(shù)組形式的參數(shù)中模擬傳值調(diào)用。也就是相當(dāng)于函數(shù)調(diào)用者聲稱(chēng):”我給你一個(gè)指向它的指針,但你不能去修改它?!奔僭O(shè)函數(shù)編寫(xiě)者遵循了這個(gè)商定,那么就相當(dāng)于模擬了值傳遞。這也是const最有用之處了:用來(lái)限定函數(shù)的形參,這樣該函數(shù)將不會(huì)修改實(shí)參指針?biāo)傅臄?shù)據(jù)。這里留神了,是函數(shù)不理應(yīng)去修改而不是不能修改,也就是說(shuō)const不能阻攔參數(shù)的修改理由見(jiàn)上。
2.防止修改指針指向的地址
1voidswapint*constp1,int*constp2;指針p1和指針p2都是指針常量,指向的地址都不能修改。
修飾函數(shù)的返回值
好多時(shí)候,我們的函數(shù)中會(huì)返回一個(gè)地址或者引用。調(diào)用這得到這個(gè)返回的地址或者引用后就可以修改所指向或者代表的對(duì)象。這個(gè)時(shí)候假設(shè)我們不夢(mèng)想這個(gè)函數(shù)的調(diào)用這修改這個(gè)返回的內(nèi)容,就理應(yīng)返回一個(gè)常量。
假設(shè)給以“指針傳遞”方式的函數(shù)返回值加const修飾,那么函數(shù)返回值(即指針)的內(nèi)容不能被修改,該返回值只能被賦給加const修飾的同類(lèi)型指針。
例如函數(shù)
1constchar*GetStringvoid;如下語(yǔ)句將展現(xiàn)編譯錯(cuò)誤:
1char*str=GetString;正確的用法是
1constchar*str=GetString;修飾全局變量
全局變量的作用域是整個(gè)文件,我們理應(yīng)盡量制止使用全局變量,以為一旦有一個(gè)函數(shù)變更了全局變量的值,它也會(huì)影響到其他引用這個(gè)變量的函數(shù),導(dǎo)致除了bug后很難察覺(jué),假設(shè)確定要用全局變量,我們理應(yīng)盡量的使用const修飾符舉行修飾,這樣方式不必要的以為修改,使用的方法與局部變量是一致的。
const在c和c++中的識(shí)別
C++中的const正常處境下是看成編譯期的常量,編譯器并不為const調(diào)配空間,只是在編譯的時(shí)候?qū)⑵谥当4嬖诿直碇?并在適當(dāng)?shù)臅r(shí)候折合在代碼中.所以,以下代碼:
usingnamespacestd;
intmain
constinta=1;
constintb=2;
intarray[a+b]=0;
forinti=0;isizeofarray/sizeof*array;i++
coutarrayendl;
在可以通過(guò)編譯,并且正常運(yùn)行.但稍加修改后,放在C編譯器中,便會(huì)展現(xiàn)錯(cuò)誤:
intmain
inti;
constinta=1;
constintb=2;
intarray[a+b]=0;
fori=0;isizeofarray/sizeof*array;i++
printf“%d”,array;
錯(cuò)誤消息:
c:est1e.c8:errorC2057:應(yīng)輸入常數(shù)表達(dá)式
c:est1e.c8:errorC2466:不能調(diào)配常數(shù)大小為0的數(shù)組
展現(xiàn)這種處境的理由是:在C中,const是一個(gè)不能被變更的普遍變量,既然是變量,就要占用存儲(chǔ)空間,所以編譯器不知道編譯時(shí)的值.而且,數(shù)組定義時(shí)的下標(biāo)務(wù)必為常量.在C語(yǔ)言中:constintsize;這個(gè)語(yǔ)句是正確的,由于它被C編譯器看作一個(gè)聲明,指明在別
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 二零二五年度健康養(yǎng)生中心加盟管理合同4篇
- 2025年度美甲店美容護(hù)膚項(xiàng)目合作合同4篇
- 二零二五年度特種耐火材料采購(gòu)及技術(shù)服務(wù)合同4篇
- 2025版農(nóng)產(chǎn)品電商平臺(tái)客戶(hù)服務(wù)外包合同4篇
- 二零二五年度民政局離婚協(xié)議書(shū)模板版權(quán)授權(quán)協(xié)議4篇
- 二零二五年度智能機(jī)器人研發(fā)與應(yīng)用股權(quán)質(zhì)押擔(dān)保合同
- 二零二五年度戀愛(ài)雙方子女撫養(yǎng)權(quán)及探望權(quán)合同2篇
- 2025年度抹灰工程施工材料采購(gòu)合同范本4篇
- 2025年度農(nóng)場(chǎng)農(nóng)業(yè)產(chǎn)業(yè)鏈金融服務(wù)合同-@-1
- 二零二五年度高標(biāo)準(zhǔn)大棚建設(shè)與農(nóng)產(chǎn)品加工合作合同2篇
- 2024公路瀝青路面結(jié)構(gòu)內(nèi)部狀況三維探地雷達(dá)快速檢測(cè)規(guī)程
- 2024年高考真題-地理(河北卷) 含答案
- 中國(guó)高血壓防治指南(2024年修訂版)解讀課件
- 2024年浙江省中考科學(xué)試卷
- 2024風(fēng)力發(fā)電葉片維保作業(yè)技術(shù)規(guī)范
- 《思想道德與法治》課程教學(xué)大綱
- 2024光儲(chǔ)充一體化系統(tǒng)解決方案
- 2024年全國(guó)高考新課標(biāo)卷物理真題(含答案)
- 處理后事授權(quán)委托書(shū)
- 食材配送服務(wù)方案投標(biāo)方案(技術(shù)方案)
- 足療店?duì)I銷(xiāo)策劃方案
評(píng)論
0/150
提交評(píng)論