C和C 中static關鍵字的作用

2021-06-19 03:31:12 字數 3926 閱讀 5896

c中:

1. static 

變數靜態變數的型別

說明符是

static

。靜態變數當然是屬於靜態儲存方式,但是屬於靜態儲存方式的量不一定就是靜態變數。

例如外部變數雖屬於靜態

儲存方式,但不一定是靜態變數,必須由

static

加以定義後才能成為靜態外部變數,或稱靜態全域性變數。

2. 靜態區域性變數

靜態區域性變數屬於靜態儲存方式,它具有以下特點:

(1)靜態區域性變數在函式內定義

它的生存期為整個源程式,但是其作用域仍與自動變數相同,只能在定義該變數的函式內使用該變數。退出該函式後,

儘管該變數還繼續存在,但不能使用它。

(2)允許對構造類靜態區域性量賦初值

例如陣列,若未賦以初值,則由系統自動賦以0值。

(3)對基本型別的靜態區域性變數若在說明時未賦以初值,則系統自動賦予

0值。而對自動變數不賦初值,則其值是不定的。

根據靜態區域性變數的特點,

可以看出它是一種生存期為整個源程式的量。雖然離開定義它的函式後不能使用,但如再次呼叫定義它的函式時,它又可繼續使用,

而且儲存了前次被呼叫後留下的

值。因此,當多次呼叫乙個函式且要求在呼叫之間保留某些變數的值時,可考慮採用靜態區域性變數。雖然用全域性變數也可以達到上述目的,但全域性變數有時會造成

意外的***,因此仍以採用區域性靜態變數為宜。

3.靜態全域性變數

全域性變數

(外部變數

)的說明之前再冠以

static 

就構成了靜態的全域性變數。全域性變數本身就是靜態儲存方式,

靜態全域性變數當然也是靜態儲存方式。

這兩者在儲存方式上並無不同。這兩者的區別雖在於非靜態全域性

變數的作用域是整個源程式,

當乙個源程式由多個原始檔組成時,非靜態的全域性變數在各個原始檔中都是有效的。

而靜態全域性變數則限制了其作用域,

即只在定義該變數的原始檔內有效,

在同一源程式的其它原始檔中不能使用它。由於靜態全域性變數的作用域侷限於乙個原始檔內,只能為該原始檔內的函式公用,

因此可以避免在其它原始檔中引起錯誤。從以上分析可以看出,

把區域性變數改變為靜態變數後是改變了它的儲存方式即改變了它的生存期。把全域性變數改變為靜態變數

後是改變了它的作用域,

限制了它的使用範圍。因此

static 

這個說明符在不同的地方所起的作用是不同的。

變數可以分為:全域性變數、靜態全域性變數、靜態區域性變數和區域性變數

按儲存區域分,全域性變數、靜態全域性變數和靜態區域性變數都存放在記憶體的靜態儲存區域,區域性變數存放在記憶體的棧區。

按作用域分,全域性變數在整個工程檔案內都有效;靜態全域性變數只在定義它的檔案內有效;靜態區域性變數只在定義它的函式內有效,只是程式僅分配一次記憶體,函式返回後,該變數不會消失;區域性變數在定義它的函式內有效,但是函式返回後失效。

全域性變數(外部變數)的說明之前再冠以static 就構成了靜態的全域性變數。全域性變數本身就是靜態儲存方式, 靜態全域性變數當然也是靜態儲存方式。 這兩者在儲存方式上並無不同。這兩者的區別雖在於非靜態全域性變數的作用域是整個源程式,當乙個源程式由多個原始檔組成時,非靜態的全域性變數在各個原始檔中都是有效的。 而靜態全域性變數則限制了其作用域, 即只在定義該變數的原始檔內有效, 在同一源程式的其它原始檔中不能使用它。由於靜態全域性變數的作用域侷限於乙個原始檔內,只能為該原始檔內的函式公用,因此可以避免在其它原始檔中引起錯誤。

從以上分析可以看出, 把區域性變數改變為靜態變數後是改變了它的儲存方式即改變了它的生存期。把全域性變數改變為靜態變數後是改變了它的作用域,限制了它的使用範圍。

定義乙個內部函式,只需在函式型別前再加乙個「static」關鍵字即可,只能被本檔案中的函式呼叫,而不能被同一程式其它檔案中的函式呼叫。不用擔心自己定義的函式,是否會與其它檔案中的函式同名,因為同名也沒有關係。

把區域性變數改變為靜態變數後是改變了它的儲存方式即改變了它的生存期。把全域性變數改變為靜態變數後是改變了它的作用域,限制了它的使用範圍。

4. static 

函式…..

內部函式和外部函式

當乙個源程式由多個原始檔組成時,c語言根據函式能否被其它原始檔中的函式呼叫,將函式分為內部函式和外部函式。

1 內部函式(又稱靜態函式)

如果在乙個原始檔中定義的函式,只能被本檔案中的函式呼叫,而不能被同一程式其它檔案中的函式呼叫,這種函式稱為內部函式。

定義乙個內部函式,只需在函式型別前再加乙個

「static」

關鍵字即可,如下所示:

static 

函式型別

函式名(

函式引數表

)關鍵字

「static」

,譯成中文就是

「靜態的

」,所以內部函式又稱靜態函式。但此處

「static」

的含義不是指儲存方式,而是指對函式的作用域僅侷限於本檔案。

使用內部函式的好處是:不同的人編寫不同的函式時,不用擔心自己定義的函式,是否會與其它檔案中的函式同名,因為同名也沒有關係。

2 外部函式

外部函式的定義:在定義函式時,如果沒有加關鍵字

「static」

,或冠以關鍵字

「extern」

,表示此函式是外部函式:

[extern] 

函式型別

函式名(

函式引數表

)呼叫外部函式時,需要對其進行說明:

[extern] 

函式型別

函式名(

引數型別表

)[,函式名

2(引數型別表

2)……]

;static

函式與普通函式作用域不同。僅在本檔案。只在當前原始檔中使用的函式應該說明為內部函式(static),內部函式應該在當前原始檔中說明和定義。對於可在當前原始檔以外使用的函式,應該在乙個標頭檔案中說明,要使用這些函式的原始檔要包含這個標頭檔案

static全域性變數與普通的全域性變數有什麼區別:static全域性變數只初使化一次,防止在其他檔案單元中被引用;

static區域性變數和普通區域性變數有什麼區別:static區域性變數只被初始化一次,下一次依據上一次結果值;

static函式與普通函式有什麼區別:static函式在記憶體中只有乙份,普通函式在每個被呼叫中維持乙份拷貝

全域性變數和靜態變數如果沒有手工初始化,則由編譯器初始化為0。區域性變數的值不可知。

c#中:

靜態分配的,有兩種情況:

1. 用在類裡的屬性、方法前面,這樣的靜態屬性與方法不需要建立例項就能訪問,

通過類名或物件名都能訪問它,靜態屬性、方法只有「乙份」:即如果乙個類新建有n個

物件,這n 個物件只有同乙個靜態屬性與方法;

2. 方法內部的靜態變數:

方法內部的靜態變數,執行完靜態變數值不消失,再次執行此物件的方法時,值仍存在,

它不是在棧中分配的,是在靜態區分析的, 這是與區域性變數最大的區別;

static關鍵字和const關鍵字的作用

static關鍵字至少有下列n個作用 1 函式體內static變數的作用範圍為該函式體,不同於auto變數,該變數的記憶體只被分配一次,因此其值在下次呼叫時仍維持上次的值 2 在模組內的static全域性變數可以被模組內所用函式訪問,但不能被模組外其它函式訪問 3 在模組內的static函式只可被這...

c中static關鍵字

看別人的c 會看到很多變數或者函式前面帶有static關鍵字。c中的static和php中的static有很到的不同,在php中static表示靜態化變數,乙個類中的static成員只與類有關,而與類的例項無關。c中的static關鍵字主要用於隱藏 access control 1.隱藏 函式前的s...

C 中static關鍵字

c 的static有兩種用法 面向過程程式設計中的static和物件導向程式設計中的static。前者應用於普通變數和函式,不涉及類 後者主要說明static在類中的作用。一 面向過程設計中的static 1 靜態全域性變數 在全域性變數前,加上關鍵字static,該變數就被定義成為乙個靜態全域性變...