/***const是什么?***/
在C語言中const是一個關(guān)鍵字,const字面的意思是“恒定的,不變的”,其主要的作用是const定義的變量,但又相當(dāng)于常量,其值不允許被改變。
值得注意的是:
1)const修飾的變量的生存周期為其定義到整個程序結(jié)束運(yùn)行,不管是全局變量還是局部變量。
2)對于const變量在初始化的時候就需要進(jìn)行按我們的期望進(jìn)行賦值,其他時候修改則會造成語法錯誤。
3)對于const特性跟編譯器相關(guān),不過大部分是一致的!
4)const是在編譯的時候編譯器進(jìn)行的一些處理!
/***如何使用const?***/
一、C語言中const修飾的變量占用內(nèi)存
我們先看加兩個例子:
下圖C語言

下圖C++語言

我們編譯會發(fā)現(xiàn)C語言無法通過,主要是原因是我們定義const變量n并不是常量所以編譯無法通過。所以用const定義的變量僅僅為只讀變量,同樣需要占用內(nèi)存。而C++可以通過,而它相對比較復(fù)雜,這里不在展開描述!
二、const注釋函數(shù)參數(shù)和返回值
我們通過修飾函數(shù)形參來保護(hù)傳入的參數(shù)不被意外修改,有利于程序穩(wěn)定性。我們一般不會用const修飾值傳遞,因為值傳遞是一個賦值的過程,在函數(shù)內(nèi)部修改不會改變其值,所以不是很有意義;一般用const注釋指針傳遞,防止內(nèi)部修改導(dǎo)致外部變化,比如:void sFuc(const char *des,const char *src);這樣就防止了des和src值的意外修改。
修飾返回值一般用得比較少,采用const修飾返回值一般也不用于值傳遞,而是多用于指針傳遞!
三、const變量能通過指針修改嗎?
我們通過下面兩個例子:

我們會發(fā)現(xiàn)兩者的區(qū)別const一個注釋的全局變量一個注釋的局部變量,我們編譯都能通過,不過使用全部變量的程序運(yùn)行會報段錯誤,而局部變量的能夠過得正確結(jié)果。對于通過指針修改const的值是一種與編譯器有關(guān)的行為,我們認(rèn)為可以用指針修改堆棧上的局部變量,而全部變量const修飾以后為只讀區(qū)域,如果程序訪問則會導(dǎo)致異常!
四、const注釋指針的終極奧義
我們把const處把右側(cè)的語句括起來,去掉數(shù)據(jù)類型,括起來的內(nèi)容是什么就是什么不能被修改。
如:
1)const int *pVar=&addr;根據(jù)上面的方法括起來的內(nèi)容(* pVar)表示的是指針的內(nèi)容,那么不能執(zhí)行*pVar內(nèi)容的修改,比如說*pVar=123;則編譯會報錯。不過可以修改指針的地址,比如pVar = &addr2;這樣是可以修改的并且我們再次訪問pVar的內(nèi)容則變成了addr2的內(nèi)容了。
2)同樣intconst *pVar=&addr;跟上面是一樣的處理辦法。
3)int* const pVar=&addr;這個剛剛與前面的相反,其括起來的為(pVar)所以值能使用*pVar作為左值,不能修改pVar所指向的地址。
4)對于constint* constpVar=&addr則都不可進(jìn)行修改!只能作為右值可讀。
5)我們同樣可以擴(kuò)展下對于二級指針
constchar*const*constp全部限定為只讀,都不可以改寫,如果一個開放對應(yīng)的就可以被修改!
審核編輯:劉清
-
嵌入式
+關(guān)注
關(guān)注
5198文章
20444瀏覽量
333993 -
C語言
+關(guān)注
關(guān)注
183文章
7644瀏覽量
145575 -
編譯器
+關(guān)注
關(guān)注
1文章
1672瀏覽量
51598
發(fā)布評論請先 登錄
C語言嵌入式系統(tǒng)編程注意事項-內(nèi)存操作
單片機(jī)c語言中定義字節(jié)怎么定義?
C語言與C++的區(qū)別及聯(lián)系
關(guān)鍵字volatile的含意
Typedef在C語言中的應(yīng)用
interrupt關(guān)鍵字使用
Temu跨境電商按關(guān)鍵字搜索Temu商品API的應(yīng)用及接口請求示例
C語言的編程技巧
哪些場合會用到volatile關(guān)鍵字?
天眼查平臺關(guān)鍵字搜索企業(yè)數(shù)據(jù)API接口技術(shù)指南
亞馬遜平臺根據(jù)關(guān)鍵字搜索商品API接口
怎樣去使用C語言中的const關(guān)鍵字呢
評論