在學習靜態變數中,我總結出3個會經常遇到的問題
1. 為什麼靜態區域性變數的生命週期和全域性變數一樣都是整個程式執行過程,那為什麼不能在其它的函式中訪問這個靜態區域性變數?
2. 如果乙個帶有靜態區域性變數的函式被呼叫,不是每次都執行一次靜態區域性變數的宣告**嗎?那為什麼說靜態區域性變數只初始化一次呢?
3. 既然說靜態區域性變數的生命週期是整個執行過程,那如何在它的作用域外使用它呢?
下面我們就帶著這3個問題去研究一下這3個問題(如有說錯的地方,歡迎糾正)
什麼是靜態變數
靜態變數的型別關鍵字是static。static區域性變數叫做靜態變數,它的生命週期是整個應用程式的執行時間,它只會被初始化一次。static宣告的全域性變數被縮小了作用域,它只能在所在檔案中被使用。
所以靜態變數分為靜態全域性變數和靜態區域性變數,靜態全域性變數的話只能在當前檔案中訪問,靜態區域性變數生命週期是整個程式執行期間。這次歸納的內容主要是靜態區域性變數。
不同層次的變數可以重名,在使用的時候變數名稱匹配的是所有作用域包括使用,語句的變數中層次最深的。並且在這條語句之前宣告的那個變數。
例 一 :
void func()
int a = 0;
static int b = 0;
在函式func裡,變數a屬於乙個區域性變數,a的生命週期是所在函式的執行過程,而a的作用域是所在函式的執行體**。變數b是乙個靜態變數,b的作用域和a一樣,但是b的生命週期是整個程式的執行期間。
如果在2個函式中都存在變數名b,那麼這2個看上去一樣的變數名,是分別代表2個不一樣的儲存區的,就像學生一樣,2個名字相同的學生,他們也代表著不同的個體,代表著2個不一樣的學號。為了避免出現1個變數名代表2個儲存區的情況出現,所以在別的函式中,是沒法用b這個變數名去找到func函式裡面b的儲存區的。
例 二 :
#include //宣告乙個全域性變數
int a = 0;
//宣告乙個函式,返回乙個靜態區域性變了的位址
以上是例二的執行結果,我們可以看出main函式的b和func函式中的b是代表真不同的儲存區,而且a和c的位址不是連續的,中間還存在這乙個4個位元組的儲存區,這個儲存區就是是func函式中b的位址,但在列印出a,c位址之前,並沒有呼叫過func函式。由此可以看出,靜態區域性變數是在程式開始的時候就已經分配了儲存區的,並不是在呼叫函式的時候才分配儲存區的,所謂的宣告乙個變數,就是分配乙個儲存區。我們可以當作靜態區域性變數的宣告語句是在函式外面的,在例二中無論執行多少次func函式,也不會執行static int b = 0;這條語句的,因為這條語句真正執行的地方是在函式的外面,所以說靜態變數只初始化一次。
如果在其它函式中使用靜態區域性變數,我們可以通過返回值的方式取得該靜態區域性變數的位址,就可以使用它了。
靜態區域性變數
在區域性變數前加上 static 關鍵字,就成了靜態區域性變數。靜態區域性變數存放在記憶體的全域性資料區。函式結束時,靜態區域性變數不會消失,每次該函式呼叫時,也不會為其重新分配空間。它始終駐留在全域性資料區,直到程式執行結束。靜態區域性變數的初始化與全域性變數類似 如果不為其顯式初始化,則c 自動...
靜態區域性變數
有時希望函式中的區域性變數的值在函式呼叫結束後不消失而保留原值,即其占用的儲存單元不釋放,在下一次該函式呼叫時,該變數保留上一次函式呼叫結束時的值。這時就應該指定該區域性變數為靜態區域性變數 static local variable 例 觀察靜態區域性變數的值 include using name...
靜態區域性變數
通常,在函式體內定義了乙個變數,每當程式執行到該語句時都會給該區域性變數分配棧記憶體。但隨著程式退出函式體,系統就會收回棧記憶體,區域性變數也相應失效。但有時候我們需要在兩次呼叫之間對變數的值進行儲存。通常的想法是定義乙個全域性變數來實現。但這樣一來,變數已經不再屬於函式本身了,不再僅受函式的控制,...