天天看點

6、變量屬性

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;
} 

           
6、變量屬性

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;
           
6、變量屬性

解析: 這個程式就是介于 extern 和 static 修飾的全局變量的邊界,因為 static 修飾的全局變量不能被外部通路,是以這個程式會報錯。

繼續閱讀