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 對比
可以看到 i 和 k 位址空間并不連續,差距較大,也說明 i 存儲在棧中,k 存儲在靜态存儲區。 f1() 中變量 r 為局部變量,每次進入函數 f1() 都會進行初始化。f2() 中靜态變量 r 隻初始化一次。
1、extern 用于聲明“外部”定義的變量和函數
extern 變量在檔案中的其他地方配置設定空間
extern 函數在檔案其他地方定義
2、extern 用于告訴編譯器用 c 方式編譯
c++ 編譯器和一些變種 c 編譯器預設會按自己的方式編譯函數和變量,通過 extern 關鍵可以指令編譯器“以 c 方式進行編譯”。
實驗分析:
1、案例分析
上面的代碼編譯之後結果如下:
編譯結果顯示變量 i 未定義,因為在列印 i 的時候沒有找到 i 的定義
2、程式修改
将上面的代碼更改如下,在 main 函數之前用 extern int i; 聲明,表示變量 i 在别處有定義,這樣編譯最終可以找到 i 的定義。這樣就可以通過編譯。更改後的代碼如下:
3、extern 出現在其他檔案中
當然變量 i 的定義也可能出現在其他檔案中,直接看程式
編譯運作結果如下:
程式編譯到 printf("%d\n", i); 時,由于前面聲明了 i 是 extern 屬性的,這裡就先使用,在檔案 g.c 中找到了變量 i 的定義。
1、auto 變量存儲在程式的棧中,預設屬性
2、static 變量 存儲在程式的靜态區中
3、register 變量請求存儲在 cpu 寄存器中
4、extern 變量在檔案的其他地方配置設定空間
5、extern 能夠訓示編譯器按照标準 c 方式編譯程式