C語言 static變數及其作用

2022-06-26 18:45:13 字數 1459 閱讀 1972

在 c 語言中,static 關鍵字不僅可以用來修飾變數,還可以用來修飾函式。在使用 static 關鍵字修飾變數時,我們稱此變數為靜態變數。

靜態變數的儲存方式與全域性變數一樣,都是靜態儲存方式。但這裡需要特別說明的是,靜態變數屬於靜態儲存方式,屬於靜態儲存方式的變數卻不一定就是靜態變數。例如,全域性變數雖然屬於靜態儲存方式,但並不是靜態變數,它必須由 static 加以定義後才能成為靜態全域性變數。

上面已經闡述過,全域性變數雖然屬於靜態儲存方式,但並不是靜態變數。全域性變數的作用域是整個源程式,當乙個源程式由多個原始檔組成時,全域性變數在各個原始檔中都是有效的。

如果我們希望全域性變數僅限於在本原始檔中使用,在其他原始檔中不能引用,也就是說限制其作用域只在定義該變數的原始檔內有效,而在同一源程式的其他原始檔中不能使用。這時,就可以通過在全域性變數之前加上關鍵字 static 來實現,使全域性變數被定義成為乙個靜態全域性變數。這樣就可以避免在其他原始檔中引起的錯誤。也就起到了對其他原始檔進行隱藏與隔離錯誤的作用,有利於模組化程式設計。

有時候,我們希望函式中區域性變數的值在函式呼叫結束之後不會消失,而仍然保留其原值。即它所占用的儲存單元不釋放,在下一次呼叫該函式時,其區域性變數的值仍然存在,也就是上一次函式呼叫結束時的值。這時候,我們就應該將該區域性變數用關鍵字 static 宣告為「靜態區域性變數」。

當將區域性變數宣告為靜態區域性變數的時候,也就改變了區域性變數的儲存位置,即從原來的棧中存放改為靜態儲存區存放。這讓它看起來很像全域性變數,其實靜態區域性變數與全域性變數的主要區別就在於可見性,靜態區域性變數只在其被宣告的**塊中是可見的。

對某些必須在呼叫之間保持區域性變數的值的子程式而言,靜態區域性變數是特別重要的。如果沒有靜態區域性變數,則必須在這類函式中使用全域性變數,由此也就開啟了引入***的大門。使用靜態區域性變數最好的示例就是實現統計次數的功能,如下面示例所示。

#include void count();

int main(void)

return 0;

}void count()

在該**中,我們通過在 count() 函式裡宣告乙個靜態區域性變數 num 來作為計數器。因為靜態區域性變數是在編譯時賦初值的,且只賦初值一次,在程式執行時它已有初值。以後在每次呼叫函式時就不再重新賦初值,而是保留上次函式呼叫結束時的值。這樣,count() 函式每次被呼叫的時候,靜態區域性變數 num 就會保持上一次呼叫的值,然後再執行自增運算,這樣就實現了計數功能。同時,它又避免了使用全域性變數。

通過上面的示例,我們可以得出靜態區域性變數一般的使用場景,如下所示:

在靜態資料區,記憶體中所有的位元組預設值都是 0x00。靜態變數與全域性變數也一樣,它們都儲存在靜態資料區中,因此其變數的值預設也為 0。演示示例如下所示。

#include static int g_x;

int g_y;

int main(void)

執行結果為:

g_x:0

g_y:0

x:0  

C 之static及其作用域

一 面向過程設計中的static 1 靜態全域性變數 在全域性變數前,加上關鍵字static,該變數就被定義成為乙個靜態全域性變數。我們先舉乙個全域性變數和靜態全域性變數的例子,例如,在檔案a中定義靜態全域性變數 i 和全域性變數 j includeusing namespace std stati...

static及其作用域

一 面向過程設計中的static 1 靜態全域性變數 在全域性變數前,加上關鍵字static,該變數就被定義成為乙個靜態全域性變數。我們先舉乙個靜態全域性變數的例子,如下 example 1 include void fn static int n 定義靜態全域性變數void main void f...

c語言中static作用

本文根據多篇網路部落格整合而成一.c程式一直由下列部分組成 1 正文段 cpu執行的機器指令部分 乙個程式只有乙個副本 唯讀,防止程式由於意外事故而修改自身指令 2 初始化資料段 資料段 在程式中所有賦了初值的全域性變數,存放在這裡。3 非初始化資料段 bss段 在程式中沒有初始化的全域性變數 核心...