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