C語言中的變數的儲存位置

2021-08-25 02:53:40 字數 1186 閱讀 1685

變數的預設儲存型別取決於它的申明位置。

凡是在任何**塊之外宣告的變數總是儲存在靜態記憶體中。不屬於堆疊記憶體,這類變數稱為靜態變數。靜態變數在函式執行之前建立。

在**塊內部宣告的變數的預設儲存型別是自動的,儲存在堆疊中。

對於在**塊內部宣告的變數,如果給它加上 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語言中變數的位置與程式優化

前幾天乙個朋友在網上問我 怎麼區分全域性變數,靜態變數和自動變數?我覺得奇怪,他怎麼問乙個初學者的問題,我這位朋友其實程式設計挺厲害的,呵呵。接著他說是 計算機怎麼區分 確實,人區分各種變數一看就知道了,但是計算機怎麼區分呢?沒有編譯知識可能一下子也難弄懂。計算機理解力是沒法和我們相比的,但是它比我...