共同點:
1、static和const在編譯時直接分配記憶體。
區別:
1、(本質)static是型別引用,const是例項引用。
2、(初始化)靜態變數的初始值必須是乙個常量。靜態初始值預設為0,而常量也預設為0(嗎?)。
3、(賦值)靜態變數的值在執行時可以更改賦值,而常量的值是不可改變的,執行一開始已經固定,之後修改會報錯。
4、(記憶體)靜態變數存放在全域性資料區中,伴隨著這個程式流程,能將此變數的值保留到下次呼叫,不過資料過大的靜態變數有可能造成記憶體洩露。而const常量算是乙個普通的唯讀變數,隨函式結束而結束。在c裡,const常量總是會分配記憶體,位於唯讀資料段。
在c++,如果const常量在沒有宣告為extern,那麼就是乙個編譯時的符號,不占用記憶體。
注意事項:
————————————————————————
c語言中這個例子,為什麼會報錯?
const int n = 5;
int a[n];
——————————————————
對於ansi c編譯器,const變數不等於真正的常量。
常量不存在程式中,所以是唯讀的。
而「唯讀變數」則是在記憶體中開闢乙個地方來存放它的值,只不過這個值由編譯器限定不允許被修改。c語言關鍵字const就是用來限定乙個變數不允許被改變的修飾符(qualifier)。上述**中變數n被修飾為唯讀變數,可惜再怎麼修飾也不是常量。而ansi c規定陣列定義時維度必須是「常量」,「唯讀變數」也是不可以的。
參考文章:
c#中的靜態變數和常量有什麼具體的區別?
面向過程和物件導向的static關鍵字區別
這個靜態常量會造成記憶體洩漏嗎?為什麼
const常量在空間中佔記憶體嗎
const常量是否占用記憶體?
靜態變數和非靜態變數的區別
記憶體分配 靜態變數在應用程式初始化 被裝載 時,就存在於記憶體當中,直到它所在的類的程式執行結束時才消亡 而非靜態變數需要被例項化後才會分配記憶體。生存週期 靜態變數生存週期為應用程式的存在週期 非靜態變數的存在週期取決於例項化的類的存在週期。呼叫方式 靜態變數只能通過 類.靜態變數名 呼叫,類的...
靜態函式 靜態變數和常量
靜態變數和常亮 靜態函式的呼叫,不需要例項化該類,所以節省資源 class person class student extends person 輸出成員屬性值 echo person country.輸出 中國 p1 new person echo p1 country 錯誤寫法 訪問靜態成員方...
靜態變數 非靜態變數的區別
c 變數根據定義位置的不同,具有不同的作用域,作用域可分為6種 全域性作用域,區域性作用域,語句作用域,類作用域,命名作用域和檔案作用域。從作用域看 全域性變數具有全域性作用域。全域性變數只需在乙個原始檔中定義,就可以作用於所有的原始檔。當然,其他不包括全域性變數定義的原始檔需要用extern關鍵字...