1. 程式人生 > 實用技巧 >C語言 - static 解讀

C語言 - static 解讀

static在C語言中主要是兩種用法

1、修飾區域性變數 2、修飾函式和全域性變數 區域性變數按照儲存形式來分,分為auto,static,register 首先從記憶體四區的角度去看,auto即為普通的區域性變數,儲存在棧上,當函式結束時,隨之釋放。 register為暫存器變數,存放在暫存器裡面,呼叫速度快。 在C語言中register變數不能取地址,會報錯。 而在c++中,對register做了增強,黨C++編譯器發現程式中需要取register變數的地址時,register對變數的宣告變得無效。 static修飾區域性變數時該變數是存放在靜態儲存區,生命週期是整個程式結束。 static區域性變數初次定義時就要初始化,且只能初始化一次。如果在定義的時候不初始化,編譯器就會自動賦值為0;(也就是說如果重複呼叫同一個函式,在第二次呼叫時,就不會再執行static區域性變數初始化那句話 了) 特點: static區域性變數的”記憶性”與生存期的”全域性性”
所謂”記憶性”是指在兩次函式呼叫時, 在第二次呼叫進入時, 能保持第一次呼叫退出時的值.


voidstaticLocalVar()
{
staticinta=0;// 執行期時初始化一次, 下次再呼叫時, 不進行初始化工作
printf(“%d”,a);
a++;
}
intmain()
{
staticLocalVar();// 第一次呼叫, 輸出a=0
staticLocalVar();// 第二次呼叫, 記憶了第一次退出時的值, 輸出a=1
return0;
}




注意事項:
1. “記憶性”, 程式執行很重要的一點就是可重複性, 而static變數的”記憶性”破壞了這種可重複性, 造成不同時刻至執行的結果可能不同.
2. “生存期”全域性性和唯一性. 普通的local變數的儲存空間分配在stack上, 因此每次呼叫函式時, 分配的空間都可能不一樣, 而static具有全域性唯一性的特點, 每次呼叫時, 都指向同一塊記憶體, 這就造成一個很重要的問題 ---- 不可重入性 二、 當static修飾全域性變數或者函式時,不是為了限制其儲存方式,而主要是為了限制該全域性變數或者函式的作用域僅限於本檔案,所以又稱為內部函式。此件時, 對於外部(全域性)變數, 不論是否有static限制, 它的儲存區域都是在靜態儲存區, 生存期都是全域性的. 此時的static只是起作用域限制作用, 限定作用域在本模組(文)內部.

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

轉載至:https://blog.csdn.net/y780465649/article/details/52155641