變量屬性
C語言的變量屬性
- C語言中的變量可以有自己的屬性
- 在定義變量的時候加上“屬性”關鍵字
- 屬性關鍵字指明變量的特有意義
auto關鍵字
- auto即C語言中局部變量的默認屬性
- auto表明將被修飾的變量存儲在棧上
- 編譯器默認所有的局部變量都是auto的
register關鍵字
- register關鍵字指明局部變量存儲在寄存器中
- register只是請求寄存器變量,但不一定請求成功
- register變量的必須是CPU寄存器可以接受的值
- 不能用&運算符獲取register變量的地址
#include <stdio.h>
register int g_val ; // error
int main()
{register char var;printf("0x%08x",&var); // errorreturn 0;
}
static關鍵字
- static關鍵字指明變量的“靜態”屬性
- static關鍵同時具有“作用域限定符”的意義
- static修飾的全局變量作用域只是聲明的文件中
- static修飾的函數作用域只是聲明的文件中
#include <stdio.h>
int g_var; // 全局變量,程序的任意地方都能訪問
static int g_vs; // 靜態全局變量,只有當前文件中可以訪問
int main()
{int var; // 局部變量,在棧上分配空間static int s_var; // 靜態局部變量,在靜態數據區分配空間return 0;
}
例子:
#include <stdio.h>
int f1()
{int r = 0;r++;return r;
}
int f2()
{static int r = 0;r++;return r;
}
int main(int argc, char const *argv[])
{auto int i = 0;static int k = 0;register int j = 0;printf("%p\n",&i);printf("%p\n",&k);// printf("%p\n",&j); // errorfor(i=0;i<5;i++)printf("%d\n",f1());for(i=0;i<5;i++)printf("%d\n",f2());return 0;
}
結果:
extern 關鍵字
- extern 用于聲明“外部”定義的變量和函數
- extern 變量在文件的其他地方分配空間
- extern 函數在文件的其他地方定義
- extern 用于“告訴”編譯器用C語言方式編譯
extern "C"
{int f(int a,int b){return a + b;}
}
static 和extern
#include <stdio.h>
extern int g_i;
int main()
{printf("%d\n",g_i);
}
int g_i;
總結:
- auto變量存儲在程序的棧中,默認屬性
- static 變量在程序靜態區中
- register變量請求存儲于CPU寄存器中
- extern變量在文件的其它地方分配空間
- extern 能夠指示編譯器按照標準C方式編譯程序