教學過程中,很多同學對於const這個關鍵字的理解存在很大的誤解。現在總結下對這個關鍵字理解上的誤區,希望在以後的程式設計中,能夠靈活使用const這個關鍵字。
1、 const修飾的變數是常量還是變數
對於這個問題,很多同學認為const修飾的變數是不能改變,結果就誤認為該變數變成了常量。那麼對於const修飾的變數該如何理解那?
下面我們來看乙個例子:
int main
這個比較容易理解,編譯器直接報錯,原因在於「a = 10;」這句話,對const修飾的變數,後面進行賦值操作。這好像說明了const修飾的變數是不能被修改的,那究竟是不是那,那麼下面我們把這個例子修改下:
int main
其中最後一句printf的目的是看下變數a的值是否改變,根據const的理解,如果const修飾的是變數是不能被修改的話,那麼a的值一定不會改變,肯定還是0。但是在實際執行的結果中,我們發現a的值已經變為97了。這說明const修飾的變數a,已經被我們程式修改了。
那綜合這兩個例子,我們來分析下,對於第二例子,修改的原因是buf[4]的賦值操作,我們知道buf[4]這個變數已經造成了buf這個陣列變數的越界訪問。buf陣列的成員本身只有0,1,2,3,那麼buf[4]訪問的是誰那,根據區域性變數的位址分配,可以知道buf[4]的位址和int a的位址是一樣,那麼buf[4]實際上就是訪問了const int a;那麼對buf[4]的修改,自然也修改了const int a的空間,這也是為什麼我們在最後列印a的值的時候看到了97這個結果。
那麼我們現在可以知道了,const修飾的變數是不具備不允許修改的特性的,那麼對於第乙個例子的現象我們又如何解釋那。
第乙個例子,錯誤是在程式編譯的時候給出的,注意這裡,這個時候並沒有生成可執行檔案,說明const修飾的變數可否修改是由編譯器來幫我們保護了。而第二個例子裡,變數的修改是在可執行程式執行的時候修改的,說明a還是乙個變數。
綜上所述,我們可以得出乙個結論,那就是const修飾的變數,其實質是告訴程式設計師或編譯器該變數為唯讀,如果程式設計師在程式中顯示的修改乙個唯讀變數,編譯器會毫不留情的給出乙個error。而對於由於像陣列溢位,隱式修改等程式不規範書寫造成的執行過程中的修改,編譯器是無能為力的,也說明const修飾的變數仍然是具備變數屬性的。
2、 被const修飾的變數,會被作業系統保護,防止修改
如果對於第乙個問題,有了理解的話,那麼這個問題,就非常容易知道答案了。const修飾的變數是不會被作業系統保護的。
其原因是作業系統只保護常量,而不會保護變數的讀寫。那麼什麼是常量?比如「hello world」這個字串就是被稱為字串常量。
對於這個問題的另一種證明方法,可以看下面這個程式:
int main
可以發現buf儲存的位址是在0x08048000這個位址附近的,而a的位址是在0xbf000000這個位址附近的,而0x08048000附近的位址在我們linux作業系統上是**段。這也說明了常量和變數是存放在不同區域的,自然作業系統是會保護常量的。
如果我們知道這個道理後,再看下面的題目:
int main
C語言 對迴圈的加深理解!
輸入一位整數,1.求出它是幾位數。2.分別輸出出每一位數字。3.按逆序輸出各位數字,eg 原數為123,應輸出321 思路 1.判斷幾位數n時,對該數先除以10,然後判斷除以10以後的數是否為0,如果為0,輸出它是一位數,否則進入迴圈,每次除以10,直到n等於0時,輸出迴圈次數,就算出該數是幾位數!...
C語言const的理解
const 是c語言的新的特性,很多庫函式strcpy等的實現都有使用。1.const 修飾普通變數 char,int等 e.g const char c 表示變數c是常量 2.const修飾一維指標 e.g const char p 表示p指向的內容不可以,但p可變 char const p 同上...
GO語言 對map型別的理解
package main import fmt type personinfo struct func main persondb 1 personinfo person,persondb 12345 fmt.println persondb,person 變數宣告 mymap 是宣告的map變數名...