1、auto關鍵字
編譯器預設所有的局部變量都是auto屬性。
2、register關鍵字
- register 關鍵字的作用請求将局部變量存到寄存器裡,但不一定成功。
- register 變量必須是 cpu寄存器可以接受的值。
- 不能用 & 運算符擷取 register 的位址。因為 & 是取記憶體的位址,而 register 寄存器在 cpu内部,cpu和記憶體不是一個地方。
- register 不能定義全局變量,因為全局變量的生命周期是程式運作到程式結束,這樣全局變量會一直占據cpu的寄存器,使cpu工作效率變低甚至無法正常工作。
3、static關鍵字
- static修飾的局部變量存儲在程式靜态區(等同于全局變量存儲的地方)。也就是說它可以把局部變量從 棧 上挪到程式的靜态存儲區。 雖然局部變量存儲在靜态存儲區,但它的作用域還是和局部變量一樣,它隻是壽命變長,不會被回收,但是所管轄的範圍還是和以前一樣的。
- static修飾的全局變量,隻有目前檔案裡面可以通路和調用。如果用類似 extern 這樣的關鍵字來通路這個檔案中的内容是無效的。
#include <stdio.h>
int fun1( )
{
int j;
j++;
//s++; //s在主函數中定義為static類型,但是它還是局部變量,隻是存儲在和全局變量相同地方的靜态存儲區,這裡報錯顯示為s未定義,error
return j;
}
int fun2( )
{
static int j=0; //這條語句隻會被初始化一次,定義為static類型的局部變量,隻是存儲靜态存儲區,運作後不會被記憶體回收。
j++;
return j;
}
int main( )
{
auto int i;
static int s;
register int c; // auto int c;
printf("%p\n",&i); //位址0x0044f858
printf("%p\n",&s); //位址0x0003813c,如果改為auto int s則位址為44f844,從這裡看出記憶體位址和靜态存儲區的位址不在一個地方。棧記憶體從高位址往低位址存。
// printf("%p\n",&c); // register變量不能用&通路記憶體位址,error
for(i=0;i<5;i++)
{
printf("%d\n",fun1());
}
printf("\n");
for(i=0;i<5;i++)
{
printf("%d\n",fun2());
}
return 0;
}
4、extern關鍵字
- extern變量用于聲明“外部”定義的變量和函數。
- extern用于“告訴”編譯器用c方式編譯。C++編譯器執行C語言方式的編譯 extern “c”
//test.c
#include <stdio.h>
extern int g_i;
int main()
{
printf("%d\n", g_i);
return 0;
}
//g.c
static int g_i = 2;
解析: 這個程式就是介于 extern 和 static 修飾的全局變量的邊界,因為 static 修飾的全局變量不能被外部通路,是以這個程式會報錯。