c++ 全域性變數、區域性變數、靜態全域性變數、靜態區域性變數的區別
c++ 變數根據定義的位置的不同的生命週期,具有不同的作用域,作用域可分為 6 種:全域性作用域,區域性作用域,語句作用域,類作用域,命名空間作用域和檔案作用域。
從作用域看:
全域性變數具有全域性作用域。全域性變數只需在乙個原始檔中定義,就可以作用於所有的原始檔。當然,其他不包含全域性變數定義的原始檔需要用extern 關鍵字再次宣告這個全域性變數。
靜態區域性變數具有區域性作用域,它只被初始化一次,自從第一次被初始化直到程式執行結束都一直存在,它和全域性變數的區別在於全域性變數對所有的函式都是可見的,而靜態區域性變數只對定義自己的函式體始終可見。
區域性變數也只有區域性作用域,它是自動物件(auto),它在程式執行期間不是一直存在,而是只在函式執行期間存在,函式的一次呼叫執行結束後,變數被撤銷,其所占用的記憶體也被收回。
靜態全域性變數也具有全域性作用域,它與全域性變數的區別在於如果程式包含多個檔案的話,它作用於定義它的檔案裡,不能作用到其它檔案裡,即被static關鍵字修飾過的變數具有檔案作用域。這樣即使兩個不同的原始檔都定義了相同名字的靜態全域性變數,它們也是不同的變數。
從分配記憶體空間看:
全域性變數,靜態區域性變數,靜態全域性變數都在靜態儲存區分配空間,而區域性變數在棧裡分配空間。
全域性變數本身就是靜態儲存方式, 靜態全域性變數當然也是靜態儲存方式。這兩者在儲存方式上並無不同。這兩者的區別雖在於非靜態全域性變數的作用域是整個源程式,當乙個源程式由多個原始檔組成時,非靜態的全域性變數在各個原始檔中都是有效的。 而靜態全域性變數則限制了其作用域, 即只在定義該變數的原始檔內有效,在同一源程式的其它原始檔中不能使用它。由於靜態全域性變數的作用域侷限於乙個原始檔內,只能為該原始檔內的函式公用,因此可以避免在其它原始檔中引起錯誤。
從以上分析可以看出, 把區域性變數改變為靜態變數後是改變了它的儲存方式即改變了它的生存期。把全域性變數改變為靜態變數後是改變了它的作用域,限制了它的使用範圍。因此static 這個說明符在不同的地方所起的作用是不同的。應予以注意。
tips:
static 全域性變數:改變作用範圍,不改變儲存位置
static 區域性變數:改變儲存位置,不改變作用範圍
靜態函式:在函式的返回型別前加上static關鍵字,函式即被定義為靜態函式。靜態函式與普通函式不同,它只能在宣告它的檔案當中可見,不能被其它檔案使用。
如果在乙個原始檔中定義的函式,只能被本檔案中的函式呼叫,而不能被同一程式其它檔案中的函式呼叫,這種函式也稱為內部函式。定義乙個內部函式,只需在函式型別前再加乙個「static」關鍵字即可。
C 學習日記(變數)
變數的生存範圍 乙個變數從宣告到結束的過程 在函式體內或復合語句內部定義的乙個變數 包括main函式 區域性變數未初始化時其值是隨機的 程式執行到函式體或復合語句之外時這個變數就會自動釋放 變數 常量等物件的作用範圍為整個程式 全域性變數的生命期始於程式的執行,結束於程式的退出 全域性變數未初始化時...
c 學習筆記 變數
c 程式的基礎 變數 1 要想什麼是說明什麼是變數,首先要明白變數的資料型別,資料型別告訴我們資料的意義以及我們能在資料上執行的操作 重要 c 支援廣泛的資料型別它定義了幾種基本內建型別,同時也為自定義資料型別提供了機制。本篇中主要介紹內建型別。一 基本算數型別 首先介紹算術型別,算數型別分為兩種 ...
C 引用變數學習
1 reference variable rv 主要用處是作為方程的形式引數,使用rv 可以直接對原資料進行操作而不是該資料的拷貝,節省了時間和空間,尤其是對於結構體以及類的乙個物件來說,對於普通型別資料來說,傳值呼叫是不錯的選擇。2 使用 type name 的形式定義乙個引用變數,參考 c pr...