c語言 static的用法

2022-08-26 11:15:10 字數 2971 閱讀 7349

static在c裡面可以用來修飾變數,也可以用來修飾函式。

先看用來修飾變數的時候。變數在c裡面可分為存在全域性資料區、棧和堆裡。其實我們平時所說的堆疊是棧而不是堆,不要弄混。

int a ;

int main()

a是全域性變數,b是棧變數,c是堆變數。

static對全域性變數的修飾,可以認為是限制了只能是本檔案引用此變數。有的程式是由好多.c檔案構成。彼此可以互相引用變數,但加入static修飾之後,只能被本檔案中函式引用此變數。

static對棧變數的修飾,可以認為棧變數的生命週期延長到程式執行結束時。一般來說,棧變數的生命週期由os管理,在退棧的過程中,棧變數的生命也就結束了。但加入static修飾之後,變數已經不再儲存在棧中,而是和全域性變數一起儲存。同時,離開定義它的函式後不能使用,但如再次呼叫定義它的函式時,它又可繼續使用, 而且儲存了前次被呼叫後留下的值。

static對函式的修飾與對全域性變數的修飾相似,只能被本檔案中的函式呼叫,而不能被同一程式其它檔案中的函式呼叫。

檔案a.c

static int i; //只在a檔案中用

int j;          //在工程裡用

static void init()         //只在a檔案中用

void callme()          //在工程中用

上面的全域性i變數和init()函式只能用在a.c檔案中,全域性變數sum的作用域只在callme裡。變數j和函式callme()的全侷限擴充到整個工程檔案。所以可以在下面的b.c中用extern關鍵字呼叫。extern告訴編譯器這個變數或者函式在其他檔案裡已經被定義了。

檔案b.c

extern int j;                    //呼叫a檔案裡的

extern void callme();   //呼叫a檔案裡的

int main()

extern的另外用法是當c和c++混合程式設計時如果c++呼叫的是c原始檔定義的函式或者變數,那麼要加extern來告訴編譯器用c方式命名函式:

檔案a.cpp呼叫a.c裡面的變數i和函式callme()

extern "c"  //在c++檔案裡呼叫c檔案中的變數

int main()

二 static法則:

a、若全域性變數僅在單個c檔案中訪問,則可以將這個變數修改為靜態全域性變數,以降低模組間的耦合度;

b、若全域性變數僅由單個函式訪問,則可以將這個變數改為該函式的靜態區域性變數,以降低模組間的耦合度;

c、設計和使用訪問動態全域性變數、靜態全域性變數、靜態區域性變數的函式時,需要考慮重入問題;

注:耦合性(英語:coupling,dependency,或稱耦合力或耦合度)是一種軟體度量,是指一程式中,模組及模組之間資訊或引數依賴的程度。內聚性是乙個和耦合性相對的概念,一般而言低耦合性代表高內聚性,反之亦然。耦合性和內聚性都是由提出結構化設計概念的賴瑞·康斯坦丁所提出。低耦合性是結構良好程式的特性,低耦合性程式的可讀性及可維護性會比較好。

全域性變數有外部、靜態兩種儲存方式。

(1)全域性變數一般用外部儲存方式儲存,用保留字extern加以定義。此時,變數的作用域是構成整個程式的所有程式檔案,也就是定義的外部變數可供其它程式檔案使用。

使用這樣的全域性變數一定要非常慎重,一旦產生錯誤,將波及整個程式。

(2)如果希望全域性變數僅限於本程式檔案使用,而其它程式檔案中不能引用,這時必須將其儲存方式定義為靜態儲存方式,用保留字static加以定義。此時稱為靜態外部變數。

例如,在上例檔案filel.c中,如果作這樣的定義:

static int a:

則變數a的作用域被縮小至本程式檔案filel.c,檔案file2.c中不能引用。

值得注意的是對全域性變數加static,定義為靜態儲存方式,並不意味著是靜態儲存;而不加static,是動態儲存。兩種形式的全域性變數(外部變數)都是靜態儲存方式,都是編譯時分配儲存空間,但作用域不同。使用靜態外部變數,有利於隔離錯誤,有利於模組化程式設計。

(3)全域性變數的預設儲存方式是外部儲存方式。

前面章節中的程式沒有見到變數的儲存類別定義,實際上採用變數的預設儲存方式。對區域性變數採用auto方式,對全域性變數採用extern方式。這也是至今為止,我們在程式中沒有見到auto、extern等的原因。

至此,我們對變數的儲存類別及資料型別進行了全面討論,在此作個小結。

1.變數定義的一般形式

儲存類別資料型別變數表;

2.變數定義的作用

①規定了變數的取值範圍。

②規定了變數進行的執行操作。

③規定了變數的作用域。

④規定了變數的儲存方式。

⑤規定了變數占用的儲存空間。

3.區域性變數和全域性變數

從作用域角度將變數分為區域性變數和全域性變數。它們採取的儲存類別如下:

區域性變數:

①自動變數,即動態區域性變數(離開函式,值就消失)。

②靜態區域性變數(離開函式,值仍保留)。

③暫存器變數(離開函式,值就消失)。

④形式引數可以定義為自動變數或暫存器變數。

全域性變數:

①靜態外部變數(只限本程式檔案使用)。

②外部變數(即非靜態的外部變數,允許其它程式檔案引用)。

4.動態儲存和靜態儲存

從變數存在時間可將變數儲存分為動態儲存和靜態儲存。靜態儲存是在整個程式執行時都存在,而動態儲存則是在呼叫函式時臨時分配儲存單元。

動態儲存:

①自動變數(函式內有效)。

②暫存器變數(函式內有效)。

③形式引數。

靜態儲存:

①靜態區域性變數(函式內有效)。

②靜態外部變數(本程式檔案內有效)。

③外部變數(整個程式可引用)。

5.靜態儲存區和動態儲存區

從變數值存放的位置可將變數儲存區分為靜態儲存區和動態儲存區:

記憶體中靜態儲存區:

①靜態區域性變數。

②靜態外部變數。

③外部變數(可被同一程式其它檔案引用)。

記憶體中動態儲存區:自動變數和形式引數。

cpu中的暫存器:暫存器變數。

c語言static用法

c程式一直由下列部分組成 1 正文段 cpu執行的機器指令部分 乙個程式只有乙個副本 唯讀,防止程式由於意外事故而修改自身指令 2 初始化資料段 資料段 在程式中所有賦了初值的全域性變數,存放在這裡。3 非初始化資料段 bss段 在程式中沒有初始化的全域性變數 核心將此段初始化為0。4 棧 增長方向...

C語言中static的用法

根據 c程式語言 第二版 中4.6 靜態變數,總結如下 static用在三個地方分別為 宣告靜態外部變數 宣告靜態函式 宣告內部變數。1 宣告靜態外部變數 只能在宣告的檔案中呼叫,在工程的其他檔案中使用extern 也沒辦法呼叫。需要注意的是,這裡的檔案為.c或是.cpp檔案。如果為標頭檔案.h,宣...

c語言中static的用法

1.static定義變數 1 區域性 a.靜態區域性變數在函式內部定義,生存期為整個源 但作用域與自動變數相同,只能在定義的函式裡面使用。退出該函式後,雖然此變數還存在記憶體中,但不能使用。b.對基本型別的靜態區域性變數若在說明時未賦以初值,則系統自動賦予為0.而對於自動變數不賦值,其值是不確定的。...