static
在c語言中,關鍵字
static
有三個明顯的作用:
1)在函式體,乙個被宣告為靜態的變數在這一函式被呼叫過程中維持其值不變。
2) 在模組內(但在函式體外),乙個被宣告為靜態的變數可以被模組內所用函式訪問,但不能被模組外其它函式訪問。它是乙個本地的全域性變數。
3) 在模組內,乙個被宣告為靜態的函式只可被這一模組內的其它函式呼叫。那就是,這個函式被限制在宣告它的模組的本地範圍內使用。
大多數應試者能正確回答第一部分,一部分能正確回答第二部分,同是很少的人能懂得第三部分。這是乙個應試者的嚴重的缺點,因為他顯然不懂得本地化資料和**範圍的好處和重要性。
摘自:上一節我們講到,全域性變數和函式的作用範圍預設是整個程式,也就是所有的原始檔。這給我們帶來了很大的方便,讓我們能夠在 a 檔案中呼叫 b 檔案中定義的變數和函式,不必把所有的**都集中到乙個檔案,有利於模組化的程式設計。
但是有時候這也會帶來衝突,例如在 a.c 中定義了乙個全域性變數 n,在 b.c 中又定義了一次,編譯時就會發生重複定義的錯誤,因為變數只能定義一次。
如果兩個檔案都是我們自己編寫的或者其中乙個是,遇到這樣的情況還比較好處理,改變變數的名字就可以;但如果兩個檔案都是其他程式設計師編寫的,或者是第三方的庫,修改起來就頗費精力了。所以,實際開發中我們一般將不需要被其他檔案呼叫的全域性變數或函式的作用範圍限制在當前檔案中。
可以通過 static 關鍵字來限制,請看下面的**。
a.c 原始碼:
#includestatic
int n =10;
void
print_n_a
()
b.c 原始碼:
#includestatic
int n =20;
void
print_n_b
()
main.c 原始碼:
#include#include
int n =
100;
intmain
()
執行結果:
n(a.c) = 10
n(b.c) = 20
n(main.c) = 100
我們在 a.c、b.c 和 main.c 中都定義了變數 n,a.c 和 b.c 中的變數 n 都只在各自的檔案內有效,main.c 中的變數 n 在整個程式內有效。
由此可見,加了 static 的變數或函式的作用範圍僅限於當前檔案,對其他原始檔隱藏,利用這一特性可以在不同的檔案中定義同名的變數或函式,而不必擔心命名衝突。static 宣告的變數稱為
靜態變數
,不管是全域性變數還是區域性變數,都儲存在靜態資料區(全域性變數本來就儲存在靜態資料區,即使不加 static)。
靜態資料區的資料在程式啟動時就會初始化,直到程式執行結束;對於**塊中的靜態區域性變數,即使**塊執行結束,也不會銷毀。
注意:靜態資料區的變數只能初始化(定義)一次,以後只能改變它的值,不能再被初始化,即使有這樣的語句,也無效。
請看下面的**:
#include#include
intmain
()printf
("1+2+3+...+99+100 = %d\n"
, result);
system
("pause"
);return0;
}int
sum(
int n)
執行結果:
1+2+3+...+99+100 = 5050
我們在 sum() 中定義了乙個靜態區域性變數 result,它儲存在靜態資料區,sum() 函式執行結束也不會銷毀,下次呼叫繼續有效。靜態資料區的變數只能初始化一次,第一次呼叫 sum() 時已經對 result 進行了初始化,所以再次呼叫時就不會初始化了,也就是說 static int result = 0; 語句無效。
靜態區域性變數雖然儲存在靜態資料區,但是它的作用域僅限於定義它的**塊,sum() 中的 result 在函式外無效,與 main() 中的 result 不衝突,除了變數名一樣,沒有任何關係。
總結起來,static 變數的主要作用有兩個。
1) 隱藏
程式有多個原始檔時,將全域性變數或函式的作用範圍限制在當前檔案,對其他檔案隱藏。
2) 保持變數內容的持久化
將區域性變數儲存到靜態資料區。靜態資料區的內存在程式啟動時就已分配好(記憶體中所有的位元組預設值都是0x00),直到程式執行結束。
static全域性變數與普通的全域性變數有什麼區別:
static
全域性變數只初使化一次,防止在其他檔案單元中被引用;
static區域性變數和普通區域性變數有什麼區別:
static
static函式與普通函式有什麼區別:
static
函式在記憶體中只有乙份,普通函式在每個被呼叫中維持乙份拷貝。
c語言中的static
1 用static宣告區域性變數 用關鍵字static宣告區域性變數為 靜態區域性變數 時,可以讓該區域性變數在函式呼叫結束後不消失而保留原值,即其占用的儲存單元不釋放。static int a 1 2 用static宣告外部變數 有時在程式設計中,希望某些外部變數只限於被本檔案引用,而不能被其他檔...
C語言中的static
c程式一直由下列部分組成 1 正文段 cpu執行的機器指令部分 乙個程式只有乙個副本 唯讀,防止程式由於意外事故而修改自身指令 2 初始化資料段 資料段 在程式中所有賦了初值的全域性變數,存放在這裡。3 非初始化資料段 bss段 在程式中沒有初始化的全域性變數 核心將此段初始化為0。5 堆 動態儲存...
C語言中的static
在c語言中static有兩個作用,乙個是在函式中宣告變數,這樣就不會在函式的每次呼叫中都會重新初始化其值。二是宣告全域性的靜態變數或者函式。對於宣告的靜態變數或者函式,那麼它就只能在本編譯單元可見,其他編譯單元中不可見。那麼什麼叫做乙個編譯單元呢?一般來講,乙個c原始檔就是乙個編譯單元,那麼標頭檔案...