靜態變數的特點:
1、 一次儲存:靜態區域性變數只被初始化一次,下一次初始化根據上一次的結果值,有點類似於c++中類的靜態成員變數,即無論該型別生成多少個例項物件,所有的物件共用乙個靜態變數,到這裡就是無論這個函式呼叫多少次,該靜態變數只初始化一次,並沒有因為超出其生存期而被銷毀,只是外部不可見而已,用個例子說明之:
void fun1( int v )
int main( int arc, char
*args[ ])
執行的結果是:value : 50 value : 50
說明在第二次呼叫fun1( )時的初始化value的採用的是上一次value的值,value在靜態區的儲存空間並沒有因為fun1( )的結束而被釋放,即體現了一次儲存;
2、 作用域限定:靜態修飾的作用域限定功能同時體現在函式與變數上;
a) 對於函式而言,任何用static修飾的函式,其作用域僅為當前原始檔,而對外部來說這個函式是不可見的,即只有和其在同一原始檔中的函式才能呼叫這個靜態函式;反過來說,如果乙個函式僅僅被同一原始檔中的其他函式呼叫,那麼這個函式應該宣告為靜態的,這樣做的好處在於:可以一定程度上的解決不同原始檔之間函式的命名衝突問題;
b) 對於變數而言,static修飾的全域性變數,只在當前原始檔中有效,對外部不可見,外部檔案不能夠引用;
顧名思義,全域性變數是指能夠在全域性引用的變數,相對於區域性變數的概念,也叫外部變數;同靜態變數一樣,全域性變數位於靜態資料區,全域性變數一處定義,多處引用,用關鍵字「extern」引用「外部」的變數。
全域性變數也可以是靜態的,在前面有過說明,靜態全域性變數的意義就是不讓「外部」引用,是單個原始檔裡的全域性變數,即是編譯階段的全域性變數,而不是連線階段的全域性變數。
通過上面的分析,我們不難得出以下結論:
1、 靜態函式與普通函式的區別在於:靜態函式不可以被同一原始檔以外的函式呼叫。
2、 靜態區域性變數與普通區域性變數的區別在於:靜態區域性變數只初始化一次,下一次初始化實際上是依然是上一次的變數;
3、 靜態全域性變數與普通全域性變數的區別在於:靜態全域性變數的作用域僅限於所在的原始檔。
區域性變數,區域性靜態變數,全域性變數,全域性靜態變數分別
c 記憶體到底分幾個區?一 1 棧區 stack 由編譯器自動分配釋放 存放函式的引數值,區域性變數的值等。其操作方式類似於資料結構中的棧。2 堆區 heap 一般由程式設計師分配釋放,若程式設計師不釋放,程式結束時可能由os 注意它與資料結構中的堆是兩回事,分配方式倒是類似於鍊錶,呵呵。3 全域性...
全域性變數,全域性靜態變數,區域性靜態變數,區域性變數
變數可以分為全域性變數 靜態全域性變數 靜態區域性變數和區域性變數。按照儲存區分 全域性變數 靜態全域性變數和靜態區域性變數都存放在記憶體的全域性資料區,區域性變數存放在記憶體的棧區。按作用域分 全域性變數在整個工程檔案內都有效 靜態全域性變數只在定義它的檔案內有效 靜態區域性變數只在定義它的函式內...
區域性變數,區域性靜態變數,全域性變數,全域性靜態變數分別
c 記憶體到底分幾個區?一 1 棧區 stack 由編譯器自動分配釋放 存放函式的引數值,區域性變數的值等。其操作方式類似於資料結構中的棧。2 堆區 heap 一般由程式設計師分配釋放,若程式設計師不釋放,程式結束時可能由os 注意它與資料結構中的堆是兩回事,分配方式倒是類似於鍊錶,呵呵。3 全域性...