天天看點

【C語言進階剖析】5、變量屬性

c語言中的變量有自己的屬性,在定義變量的時候可以加上“屬性”關鍵字,“屬性”關鍵字指明了變量的特有意義。

加關鍵字文法:直接在類型前加關鍵字

property type var_name

示例:

auto是c語言中局部變量的預設屬性

auto 表明将被修飾的變量存儲在棧上

編譯器,預設所有的局部變量都是 auto

register 關鍵字指明将局部變量存儲在寄存器中

register 隻是請求寄存器變量,但不一定請求成功(寄存器數量有限)

register 變量必須是 cpu 寄存器可以接受的值

不能用 & 運算符擷取 register 變量的位址

說明:register 說明變量存儲在寄存器中,根本就不在記憶體中,當然不能用取位址符取記憶體位址了。 為什麼請求不一定成功呢,因為寄存器數量是有限的,當沒有寄存器可用時,請求就是不成功的。 全局變量的聲明周期從程式開始到程式結束,如果聲明為 register 變量,就一直占用寄存器,這不合理,是以 c 語言就規定全局變量不能聲明為 register 類型 既然寄存器這麼麻煩,還要有 register 關鍵字呢,因為寄存器操作比記憶體操作要快很多,為了兼顧速度,可以将有些變量放在寄存器中。

static 關鍵字指明變量的“靜态”屬性

static 修飾的局部變量存儲在程式靜态區

static 關鍵字同時具有“作用于限定符”的意義

static 修飾的全局變量、函數作用域隻在聲明的檔案中

例子:

實驗分析:auto,register,static 對比

【C語言進階剖析】5、變量屬性
可以看到 i 和 k 位址空間并不連續,差距較大,也說明 i 存儲在棧中,k 存儲在靜态存儲區。 f1() 中變量 r 為局部變量,每次進入函數 f1() 都會進行初始化。f2() 中靜态變量 r 隻初始化一次。

1、extern 用于聲明“外部”定義的變量和函數

extern 變量在檔案中的其他地方配置設定空間

extern 函數在檔案其他地方定義

2、extern 用于告訴編譯器用 c 方式編譯

c++ 編譯器和一些變種 c 編譯器預設會按自己的方式編譯函數和變量,通過 extern 關鍵可以指令編譯器“以 c 方式進行編譯”。

實驗分析:

1、案例分析

上面的代碼編譯之後結果如下:

【C語言進階剖析】5、變量屬性
編譯結果顯示變量 i 未定義,因為在列印 i 的時候沒有找到 i 的定義

2、程式修改

将上面的代碼更改如下,在 main 函數之前用 extern int i; 聲明,表示變量 i 在别處有定義,這樣編譯最終可以找到 i 的定義。這樣就可以通過編譯。更改後的代碼如下:

3、extern 出現在其他檔案中

當然變量 i 的定義也可能出現在其他檔案中,直接看程式

編譯運作結果如下:

【C語言進階剖析】5、變量屬性
程式編譯到 printf("%d\n", i); 時,由于前面聲明了 i 是 extern 屬性的,這裡就先使用,在檔案 g.c 中找到了變量 i 的定義。

1、auto 變量存儲在程式的棧中,預設屬性

2、static 變量 存儲在程式的靜态區中

3、register 變量請求存儲在 cpu 寄存器中

4、extern 變量在檔案的其他地方配置設定空間

5、extern 能夠訓示編譯器按照标準 c 方式編譯程式