1. 程式人生 > >C語言-static

C語言-static

修飾函式     改變作用域,函式只能在本檔案中被呼叫,其他檔案可以函式重名;     (重名函式加static只能在檔案中呼叫,不加static能被他檔案呼叫,extern重名函式後在有static函式中呼叫不到的)。     好處:寫程式碼在函式前加上static不用考慮與其他函式重名的問題。

修飾區域性變數     改變儲存域,由棧區改為靜態區,函式棧區銷燬後此變數不會銷燬依然存在,下次呼叫值保持不變;     修飾區域性變數後,變數預設會被初始化。

    插曲:區域性變數不初始化的後果

void TestLocal()
{
	int a;
	a++;
	printf("a=%d\n", a);
}

int main()
{
   	int i;
   	for (i = 0; i < 10; ++i)
   	{
   		TestLocal();
   	}
	return 0;
}

    打印出:

        a=1         a=2         a=3         a=4         a=5         a=6         a=7         a=8         a=9         a=10

    區域性變數在函式呼叫完後棧會銷燬,但是後面繼續呼叫時a的值沒變,難道說a的地址沒有變化才能解釋通啊?

    通過打印出&a地址確實沒有變化,那麼可以解釋值沒有變,看來區域性變數還是要養成好習慣進行初始化的。

修飾全域性變數     改變作用域,變數只能在本檔案中被呼叫,其他檔案可以變數重名。     (重名變數加static只能在檔案中呼叫,不加static能被他檔案呼叫,extern外部重名變數後在有static函式中呼叫不到的)。

全域性變數     其他檔案中定義一個重名的變數,如果都沒有初始化,那麼其中一個當作定義,另一個當作宣告,使用沒有問題;     一個初始化,另一個沒有初始化,初始化當作定義,沒有初始化當作宣告,使用沒有問題;     都初始化,編譯時會報重定義錯誤。

    extern一個全域性變數,如果定義的地方沒有初始化,那麼宣告處可以進行賦值操作,且值有效;     如果定義的地方有初始化,那麼宣告處進行賦值操作在編譯時會報重定義錯誤。