/***const是什么?***/
在C語言中const是一個關鍵字,const字面的意思是“恒定的,不變的”,其主要的作用是const定義的變量,但又相當于常量,其值不允許被改變。
值得注意的是:
1)const修飾的變量的生存周期為其定義到整個程序結束運行,不管是全局變量還是局部變量。
2)對于const變量在初始化的時候就需要進行按我們的期望進行賦值,其他時候修改則會造成語法錯誤。
3)對于const特性跟編譯器相關,不過大部分是一致的!
4)const是在編譯的時候編譯器進行的一些處理!
/***如何使用const?***/
一、C語言中const修飾的變量占用內存
我們先看加兩個例子:
下圖C語言
下圖C++語言
我們編譯會發現C語言無法通過,主要是原因是我們定義const變量n并不是常量所以編譯無法通過。所以用const定義的變量僅僅為只讀變量,同樣需要占用內存。而C++可以通過,而它相對比較復雜,這里不在展開描述!
二、const注釋函數參數和返回值
我們通過修飾函數形參來保護傳入的參數不被意外修改,有利于程序穩定性。我們一般不會用const修飾值傳遞,因為值傳遞是一個賦值的過程,在函數內部修改不會改變其值,所以不是很有意義;一般用const注釋指針傳遞,防止內部修改導致外部變化,比如:void sFuc(const char *des,const char *src);這樣就防止了des和src值的意外修改。
修飾返回值一般用得比較少,采用const修飾返回值一般也不用于值傳遞,而是多用于指針傳遞!
三、const變量能通過指針修改嗎?
我們通過下面兩個例子:
我們會發現兩者的區別const一個注釋的全局變量一個注釋的局部變量,我們編譯都能通過,不過使用全部變量的程序運行會報段錯誤,而局部變量的能夠過得正確結果。對于通過指針修改const的值是一種與編譯器有關的行為,我們認為可以用指針修改堆棧上的局部變量,而全部變量const修飾以后為只讀區域,如果程序訪問則會導致異常!
四、const注釋指針的終極奧義
我們把const處把右側的語句括起來,去掉數據類型,括起來的內容是什么就是什么不能被修改。
如:
1)const int *pVar=&addr;根據上面的方法括起來的內容(* pVar)表示的是指針的內容,那么不能執行*pVar內容的修改,比如說*pVar=123;則編譯會報錯。不過可以修改指針的地址,比如pVar = &addr2;這樣是可以修改的并且我們再次訪問pVar的內容則變成了addr2的內容了。
2)同樣intconst *pVar=&addr;跟上面是一樣的處理辦法。
3)int* const pVar=&addr;這個剛剛與前面的相反,其括起來的為(pVar)所以值能使用*pVar作為左值,不能修改pVar所指向的地址。
4)對于constint* constpVar=&addr則都不可進行修改!只能作為右值可讀。
5)我們同樣可以擴展下對于二級指針
constchar*const*constp全部限定為只讀,都不可以改寫,如果一個開放對應的就可以被修改!
審核編輯:劉清
-
嵌入式
+關注
關注
5068文章
19019瀏覽量
303282 -
C語言
+關注
關注
180文章
7598瀏覽量
136195 -
編譯器
+關注
關注
1文章
1618瀏覽量
49051
發布評論請先 登錄
相關推薦
評論