- C語言中的變量能夠有本身的屬性
- 在定義變量的時候能夠加上"屬性"關鍵字
- "屬性"關鍵字指明變量的特殊意義
語法:編程
`property type var_name;`
示例:函數
void code() { auto char i; register int j; static long k; extern double m; }
- auto 即C語言中局部變量的默認屬性
- auto 代表被修飾的變量存儲於棧上
- 編譯器默認全部的局部變量都是auto
示例:code
void code() { int i; // 局部變量默認屬性爲 auto auto int j; // 顯示聲明 auto 屬性 }
- register 關鍵字指明將局部變量存儲於寄存器中(爲了得到最高的訪問速度)
- register 只是請求寄存器變量,但不必定請求成功(寄存器的數量是有限的)
- register 變量必須是CPU寄存器能夠接收的值
- 不能用 & 運算符獲取register變量的地址
示例:作用域
register int g_v; // Error, 編譯器報錯 void code() { register char var; printf("0x%p\n", &var); // Error, 編譯器報錯 }
static 關鍵字指明變量的 "靜態" 屬性get
- static 修飾的局部變量存儲在程序靜態區
static 關鍵字同時具備 "做用域限定符" 的意義編譯器
- staitc 修飾的全局變量做用域只是聲明的文件中
- staitc 修飾的函數做用域只是聲明的文件中
示例:it
#include <stdio.h> int g_v; // 全局變量,程序的任意地方均能訪問 static int g_vs // 靜態全局變量,只有當前文件中能夠訪問 int main() { int var; // 局部變量,在棧上分配空間 static int svar; // 靜態局部變量,在靜態存儲區分配空間 return 0; }
#include <stdio.h> int f1() { int r = 0; r++; return r; } int f2() { static int r = 0; r++; return r; } int main() { auto int i = 0; auto int j = 0; static int k = 0; register int y = 0; printf("%p\n", &i); printf("%p\n", &j); printf("%p\n", &k); // printf("%p\n", &y); // Error, 編譯器報錯 printf("\n"); for(i=0; i<5; i++) { printf("%d\n", f1()); } printf("\n"); for(i=0; i<5; i++) { printf("%d\n", f2()); } return 0; }
輸出: 0xbfcdcbdc 0xbfcdcbd8 0x804a020 1 1 1 1 1 1 2 3 4 5 分析: auto int i = 0; auto int j = 0; static int k = 0; 其中 i, j, k在定義時是連續的,打印輸出 i, j 地址連續, k 地址不連續,代表 k 不是在棧中分配的空間。
extern 用於聲明 "外部" 定義的變量和函數io
- extern 變量在文件的其它地方分配空間
- extern 函數在文件的其它地方定義
extern 用於 「告訴」 編譯器用 C 方式編譯編譯
- C++ 編譯器和一些變種C編譯器默認會按 "本身" 的方式編譯函數和變量,經過 extern 關鍵字能夠命令編譯器"以標準C方式進行編譯"。
示例:變量
extern "C" { int f(int a, int b) { return a + b; } }
Test_1.c #include <stdio.h> extern int getI(); int main() { printf("%d\n", getI()); return 0; } Test_2.c static int g_i; int getI() { return g_i; }
輸出: 0
- auto 變量存儲在程序的棧中,默認屬性
- static 變量存儲在程序靜態區中
- register 變量請求存儲於CPU寄存器中
- extern 變量在文件的其它地方分配空間
- extern 可以指示編譯器按照標準 C 方式編譯程序
以上內容參考狄泰軟件學院系列課程,請你們保護原創!