變數的預設儲存型別取決於它的申明位置。
凡是在任何**塊之外宣告的變數總是儲存在靜態記憶體中。不屬於堆疊記憶體,這類變數稱為靜態變數。靜態變數在函式執行之前建立。
在**塊內部宣告的變數的預設儲存型別是自動的,儲存在堆疊中。
對於在**塊內部宣告的變數,如果給它加上 static 關鍵字,可以使它的儲存型別由自動轉變為靜態。具有靜態儲存型別的變數在整個執行過程中一直存在。而不僅僅是它所在的**塊執行的時候存在。
注意:修改變數的儲存型別,並不修改變數的作用域,它只是在該**塊內部按名字訪問。
暫存器變數:register 關鍵字
明確兩個概念:作用域:該變數只能在哪些區域內被訪問。比如,若某變數是全域性的,則在整個**區域中都可以被訪問;若在函式內部,則只能在該函式內部被訪問。
變數的初始化
如果不顯式的初始化,靜態變數的初始化為0;
而自動變數是不做任何初始化的,是隨機值。
static 定義變數
#include static int m;
int fun1()
int fun2()
int main()
static 總結:
當 static 修飾全域性變數或函式時,其變數儲存型別和作用域都不變,只改變它的鏈結屬性,將外部鏈結改為內部鏈結。也就是說變數或者函式只能在當前原始檔中訪問,而不能在其他原始檔中訪問。
當 static 修飾區域性變數時,其變數的作用域和鏈結屬性(只有內部鏈結)都不變,只改變它的儲存型別(將型別從堆疊區變到靜態區)。
變數的作用域、鏈結屬性和儲存型別總結
變數型別
宣告位置
是否儲存於堆疊
作用域如果宣告為static
全域性變數
所有**塊之外
否從宣告到檔案尾
改變了鏈結屬性,不允許從其他檔案中訪問
區域性變數
**塊起始處
是整個**塊
儲存型別從堆疊區變到靜態區,它的值在整個程式的執行期一直保持
形式引數
函式頭部
是整個函式
不允許
C 語言中變數的儲存類別
在說明c 語言中變數的儲存類別之前,我們需要搞明白生存期和作用域兩個概念。生存期和作用域是指從時間和空間兩個角度去描述變數的特性。不同的變數儲存類別直接導致了變數的生存期不同,通俗的說,也就是變數存在的時間不同。靜態儲存變數一般在變數定義之初就為變數分配了固定的儲存單元,這些儲存單元直到程式結束的時...
C語言中變數的儲存型別
變數的儲存型別 storage class 是指儲存變數值的記憶體型別。有三個地方可以用於儲存變數 普通記憶體 執行時堆疊 硬體暫存器 用於宣告變數儲存型別的關鍵字 auto static register 在所有 塊之外的變數的預設儲存型別是靜態的 static 儲存於靜態記憶體中,稱為靜態 st...
C語言中變數的位置與程式優化
前幾天乙個朋友在網上問我 怎麼區分全域性變數,靜態變數和自動變數?我覺得奇怪,他怎麼問乙個初學者的問題,我這位朋友其實程式設計挺厲害的,呵呵。接著他說是 計算機怎麼區分 確實,人區分各種變數一看就知道了,但是計算機怎麼區分呢?沒有編譯知識可能一下子也難弄懂。計算機理解力是沒法和我們相比的,但是它比我...