Static在C語言裡面有兩個作用,第一個是修飾變量,第二個是修飾函數。
1、Static修飾變量
按照作用范圍的不同,變量分為局部變量和全局變量。如果用static修飾變量,不論這個變量是全局的還是局部的都是存儲在靜態數據區。下面分開來講:
¨ 如果用static修飾全局變量,我們稱其為靜態全局變量。
我們用static修飾全局變量的主要目的就是:使得其作用域僅限於變量被定義的文件中(即從變量定義處到本文件結尾處),其它文件不論通過什麼方式都不能訪問。
¨ 如果用static修飾局部變量,我們稱其為靜態局部變量。
我們用static修飾局部變量的目的主要有兩個:
1) 在某個函數體裡面定義的靜態局部變量,只能在本函數體被訪問,即使同一個文件的其它函數也訪問不了。
2) 靜態局部變量總存儲在靜態數據區,所以即使這個函數運行結束,這個靜態局部變量的值不會被銷毀,函數下次使用時仍然要用到這個值。
下面給出一個例程:
#include <stdio.h>
static int j; // 靜態全局變量
int fun1(void)
{
static int i = 0;
i++;
return i;
}
int fun2(void)
{
j = 0;
j++;
return j;
}
int main(int argc, char *argv[])
{
int k = 0, m = 0, n = 0;
for(k=0; k<10; k++){
m = fun1( );
n = fun2( );
printf("%d,%d\n", m, n);
}
return 0;
}
結果:
1,1
2,1
3,1
4,1
5,1
6,1
7,1
8,1
9,1
10,1
從例程的運行結果可以看出:
對於fun1( ),運行一次之後,變量i保持了原來的數據,並沒有銷毀,而是在下一次調用的時候繼續使用,所以才會有1、2、3…10這樣的結果。而對於fun2( ),運行一次之後,變量j的值被銷毀了,所以第二次調用結束j仍然保持原值“1”,所以循環十次,每次都是1
2、Static修飾函數
在函數前加static,則此函數成為靜態函數(內部函數),我們用static修飾函數的主要目的是:用來表示不能被其它文件訪問的一個函數(和用static修飾全局變量的目的一樣,都是不允許其它文件訪問)。這樣一來便有一個好處:程序員不用擔心自己編寫的函數與其他文件的函數同名。
對局部靜態變量的特別說明
(1)靜態局部變量數據屬於靜態存儲類別,在靜態存儲區內分配內存單元,在整個程序運行期間都不釋放。而自動變量(即動態局部變量)屬於動態存儲類別,占動態存儲區空間而不占用靜態存儲區空間,函數調用結束後立即釋放空間。
(2)靜態局部變量時在編譯時被賦值的,即自始至終只賦值一次,在程序運行時它已經有初值。以後每次調用函數時不再重新賦初值而只是保留上次函數調用結束時的值。而自動變量賦初值,不是在編譯時進行的,而是在運行時進行,所以每調用一次函數就賦一次初值。
(3)如在定義局部變量時不賦初值,則對靜態局部變量來說,編譯時自動賦一個初值0(對數值型變量)或空字符(對字符變量)。而對自動變量來說,如果不賦初值,則它的值是一個不確定的值。這是由每次動態分配的內存單元不同所決定的。