4 變數屬性
阿新 • • 發佈:2020-08-29
目錄
C語言的變數屬性
-
C語言中的變數可以有自己的屬性
-
在定義變數的時候可以加上“屬性”關鍵字
-
“屬性”關鍵字指明變數的特有意義
-
語法:
property type var_name;
-
示例
int main() { auto char i; register int j; static long k; extern double m; return 0; }
auto 關鍵字
-
auto
即C語言中區域性變數的預設屬性 -
auto
-
編譯器預設所有的區域性變數都是
auto
的 -
示例
void f() { int i; //區域性變數預設屬性為 auto auto int j; //顯式宣告 auto 屬性 }
register 關鍵字
-
register
關鍵字指明將區域性變數儲存在暫存器中,而不是記憶體中 -
register
只是請求暫存器變數,但不一定請求成功,暫存器的訪問速度比記憶體快 -
register
變數必須是CPU暫存器可以接受的值 -
不能用
&
運算子獲取register
變數的地址,因為取地址符&
得到的地址是記憶體中的地址 -
示例
#include <stdio.h> register int g_v; //error int main() { register char var; printf("0x%08X\n",&var); //error return 0; }
static 關鍵字
-
static
關鍵字指明變數的“靜態”屬性static
修飾的區域性變數儲存在程式靜態區,棧 -> 靜態資料區
-
static
關鍵字同時具有“作用域限定符”的意義static
修飾的全域性變數作用域只是宣告的檔案中static
-
示例
#include <stdio.h> int g_v; //全域性變數,程式的任意地方都能訪問 static int g_vs; //靜態全域性變數,只有當前檔案中可以訪問 int main() { int var; //區域性變數,在棧上分配空間 static int svar; //靜態區域性變數,在靜態資料區分配空間 }
-
auto
,register
,static
對比分析#include <stdio.h> int f1() { int r = 0; r++; return r; } int f2() { static r = 0; r++; return r; } int main() { auto int i = 0; //顯式宣告auto屬性,i為棧變數 static int j = 0; //區域性變數k的儲存區位於靜態區,作用域位於main中 register int k = 0; //向編譯器申請將j儲存於暫存器中 //i,j的地址會相差很大 printf("%p\n", &i); printf("%p\n", &j); //printf("%p\n", &k); //error for (i = 0; i < 5; i++) { printf("%d\n", f1()); } for (i = 0; i < 5; i++) { printf("%d\n", f2()); } return 0; } //數出結果 0117F8A4 0002A13C 1 1 1 1 1 1 2 3 4 5
extern 關鍵字
-
extern
用於宣告“外部”定義的變數和函式extern
變數在檔案的其他地方分配空間extern
函式在檔案的其他地方定義
-
extern
用於“告訴”編譯器用C方式編譯-
C++編譯器和一些變種C編譯器預設會按“自己”的方式編譯函式和變數,通過
extern
關鍵字可以命令編譯器“以標準C方式進行編譯” -
示例
extern "C" { int f(int a,int b){ return a + b; } }
-
-
static
和extern
的使用//main.c #include <stdio.h> extern int getI(); int main() { printf("%d\n", getI()); return 0; } //g.c static int g_i = 1; //只能在當前檔案中訪問 int getI() { return g_i; }