資源描述:
《C語言之const用法》由會員上傳分享,免費在線閱讀,更多相關(guān)內(nèi)容在教育資源-天天文庫。
1、C語言之const與static詳解看到const關(guān)鍵字,很多人想到的可能是const常量,其實關(guān)鍵字const并不能把變量變成常量!在一個符號前加上const限定符只是表示這個符號不能被賦值。也就是它的值對于這個符號來說是只讀的,但它并不能防止通過程序的內(nèi)部(甚至是外部)的方法來修改這個值(C專家編程.p21)。也就是說const變量是只讀變量,既然是變量那么就可以取得其地址,然后修改其值??磥韈onst也是防君子不防小人?。?)const使用情況分類詳析1、const的普通用法constintn=10;意思很明顯,n是一個只讀變量
2、,程序不可以直接修改其值。這里還有一個問題需要注意,即如下使用:inta[n];在ANSIC中,這種寫法是錯誤的,因為數(shù)組的大小應(yīng)該是個常量,而n只是一個變量。2、const用于指針constint*p;intconst*p;int*constp;在最后的一種情況下,指針是只讀的(即p只讀),而在另外兩種情況下,指針?biāo)赶虻膶ο笫侵蛔x的(即*p只讀)。const是一個左結(jié)合的類型修飾符,它與其左側(cè)的類型修飾符一起為一個類型修飾符,所以,intconst限定*p,不限定p。int*const限定p,不限定*p。這里有一個簡便的區(qū)分方法:
3、沿著*號劃一條線,如果const位于*的左側(cè),則const就是用來修飾指針?biāo)赶虻淖兞?,即指針指向為常量;如果const位于*的右側(cè),const就是修飾指針本身,即指針本身是常量。3、const用于函數(shù)的地址傳遞參數(shù)voidfoo(constint*p)這種形式通常用于在數(shù)組形式的參數(shù)中模擬傳值調(diào)用。也就是相當(dāng)于函數(shù)調(diào)用者聲稱:"我給你一個指向它的指針,但你不能去修改它。"如果函數(shù)編寫者遵循了這個約定,那么就相當(dāng)于模擬了值傳遞。這也是const最有用之處了:用來限定函數(shù)的形參,這樣該函數(shù)將不會修改實參指針?biāo)傅臄?shù)據(jù)。這里注意了,是函數(shù)
4、不應(yīng)該去修改而不是不能修改,也就是說const不能阻止參數(shù)的修改(原因見上)。4、const用于限定函數(shù)的返回值constintfoo();conststructmytypefoo();上述寫法限定函數(shù)的返回值不可被更新,當(dāng)函數(shù)返回內(nèi)部的類型時,已經(jīng)是一個數(shù)值,當(dāng)然不可被賦值更新,所以,此時const無意義,最好去掉,以免困惑。當(dāng)函數(shù)返回自定義的類型時,這個類型仍然包含可以被賦值的變量成員,所以,此時有意義。一、宏定義:主要是一些語法問題和技巧例如:#defineFIND(s,e)(size_t)&(((structs*)(0))->
5、e)//求結(jié)構(gòu)體內(nèi)的變量相對于結(jié)構(gòu)體的偏移量#defineSECONDS_PER_YEAR(360*24*60*60)UL//求一年中的秒數(shù)#defineMIN(a,b)(((a)<=(b))?(a):(b))//求最小值說明:盡可能考慮移植性,由于代碼可能在16位機(jī),也有可能在32位機(jī)器上運行,所以采用size_t和UL都是基于移植性的考慮。二、const用法:定義常量,修飾指針、函數(shù)的輸入?yún)?shù)和返回值,簡單說const表示只讀的意思,本質(zhì)上來說它只是在全局?jǐn)?shù)據(jù)段或者棧中定義的是一個只讀的常量,不是真正位于字符串常量區(qū)。Const的
6、目的是為了產(chǎn)生高質(zhì)量的代碼,提高代碼的可讀性,同時保護(hù)好不能被任意改變的內(nèi)存,從而降低Bug產(chǎn)生的概率。???constinta=10;constintb;//錯誤,常量必須初始化???inta=10,b=9;???constint*p1=&a;//指針指向的內(nèi)容只讀,不能通過該指針去寫???*p1=11;//錯誤???int*constp2=&a;//指針本身只讀,指針初始化到一個對象后,將不能被修改p2=&b;//錯誤constint*p3const=&a;//指針本身和指向的內(nèi)容都是只讀?constchar*fp1(void)/
7、/修飾返回值,表示返回的指針指向內(nèi)容只讀{???char*p="dddd";???returnp;}voidfp1(constchar*str){???*str=4;//錯誤???constchar*p=str;//p必須為const,才能接受str}int_tmain(intargc,_TCHAR*argv[]){???constchar*d=fp1();???printf("%s",d);}?三、extern用法:在別的文件中定義的變量,要想在本文件中使用,必須先用extern聲明,例如:externa;之后就當(dāng)成在本文件中定義的
8、變量一樣使用。?四、static用法:1.修飾變量,從生存域和訪問域兩個方面說明,無論static變量定義在函數(shù)內(nèi)或外,該變量都位于數(shù)據(jù)段中;定義于函數(shù)體外的static變量的訪問域僅僅是它所在文件中定義的函數(shù),其他文件