c 變數的生命週期及儲存型別

2021-10-08 15:59:15 字數 2152 閱讀 9619

動態儲存

auto 自動變數

register 暫存器變數

靜態儲存

static 靜態變數

extern 外部變數

1.自動變數型別說明符為auto

通過auto關鍵字來修飾乙個區域性變數。這意味著每一次執行到定義變數的時候,都會產生乙個行的變數,並且重新對它初始化

這種儲存型別是c語言程式中使用最廣泛的一種型別。c語言規定,函式內凡未加儲存型別說明的變數均視為自動變數,也就是說自動變數可省去說明符auto。

如:int、float、double、char。

注意:auto可以省略,區域性變數預設儲存方式就是自動變數型別,即auto int=int,使用完立即銷毀

自動變數的作用域僅限於定義該變數的個體內(區域性變數)。在函式中定義的自動變數,只在該函式內有效。在復合語句中定義的自動變數只在該復合語句中有效。

自動變數屬於動態儲存方式,只有在使用它,即定義該變數的函式被呼叫時才給它分配儲存單元,開始它的生存期。函式呼叫結束,釋放儲存單元,結束生存期。因此函式呼叫結束之後,自動變數的值不能保留。在復合語句中定義的自動變數,在退出復合語句後也不能再使用,否則將引起錯誤。

由於自動變數的作用域和生存期都侷限於定義它的個體內(函式或復合語句內),因此不同的個體中允許使用同名的變數而不會混淆。即使在函式內定義的自動變數也可與該函式內部的復合語句中定義的自動變數同名。

void

show()

main()

//執行了三次show函式,輸出結果是三個10,每執行一次show函式,對i再重新初始化一次10,故為auto型別

2.靜態變數型別說明符為static

定義的時候必須初始化,只進行一次初始化,保留上一次結果。

生命週期:跟隨程式啟動時就為它定義好,程式執行結束,它才結束(從程式啟動到程式結束)。

void

show()

main()

//輸出結果:10,11,12

int count=0;

while

(count<3)

/*輸出:

s_count=1

i_count=1

s_count=2

i_count=1

s_count=3

i_count=1

3.暫存器變數型別說明符register

指定某個區域性變數存放到計算機硬體的暫存器中而不是記憶體中。

暫存器(cpu):快取資料,但儲存資料有限。

由於暫存器數量有限,當定義多個暫存器變數時,計算機不一定會分配給實際儲存。

各類變數都存放在儲存器捏,當對乙個變數頻繁讀寫時,必然要反覆訪問儲存器,從而花費大量的訪問時間。c提供了暫存器變數,這種變數存放在cpu的暫存器中,使用時不需要訪問記憶體,直接從暫存器中讀寫,可提高效率。

對於迴圈次數多的迴圈控制變數可定義為暫存器變數。

#include

main()

}

注意:

1、只有區域性自動變數和形式引數才可以定義為暫存器變數。

2、根據機器不同,cpu中暫存器的個數是有限制的。

外部儲存變數extern

#include

int i;//全域性變數,可以在當前檔案裡任意函式中使用,自動初始化為0

int l=

5;//全域性變數可以賦初值

extern

int j;//外部變數

main()

變數作用域

區域性變數:被{}包含的變數

全域性變數:沒有被{}包含,不做初始化,預設初始化為0。

大括號產生到大括號結束,同一作用域下,變數名不能同名

同名問題的選擇:就近原則,當有與自己同名的變數時,使用距離最近的那個

c變數的生命週期

內部變數 生命週期 函式結束時結束.作用域 宣告的花括號中.儲存區域 棧記憶體區域.不會自動初始化.但會申請空間.外部變數 生命週期 和程式的生命週期一樣.作用域 程式的所以地方做可以使用,但需要使用extren進行宣告.儲存區域 在全域性區域.自動初始化.並生命自身的儲存空間.內部靜態變數 生命週...

變數的生命週期

from 今天在論壇上看到有朋友發帖問道 既然靜態全域性變數與全域性變數都儲存在全域性資料區,為什麼作用域卻不一樣呢?也許答案非常簡單 c 就是這麼規定的,靜態全域性變數與全域性變數的唯一區別就是作用域不同。對乙個c 變數來說,有兩個屬性非常重要 作用域和生命週期,它們從兩個不同的維度描述了乙個變數...

變數的生命週期

1 全域性變數 作用域 全域性作用域 只需要在乙個原始檔中定義,就可以作用於所有的原始檔 生命週期 程式執行期一直存在 記憶體分布 全域性 靜態儲存區 注意 如果再兩個檔案中都定義了相同名字的全域性變數,則連線錯誤 變數重定義。2 全域性靜態變數 生命週期 程式執行期一直存在 作用域 檔案作用域 只...