各位看官們,大家好,上一回中咱們說的內置宏的例子,這一回咱們說的例子是:static關鍵字。閒話休提,言歸正轉。讓我們一起talk C栗子吧!
看官們,C語言提供了static關鍵字,它經常出現在變量或者函數的最前面,為什麼要加上它呢?它主要有什麼作用呢?今天我們一起來了解static關鍵字。
在介紹之前,我們先做一些鋪墊。主要是介紹一下變量或者函數的生命周期和作用域。
所謂的生命周期就是指變量或者函數在程序中可以被使用的時間,它是一段時間,可能是一分鐘或者一小時等。生命周期通常從開始使用變量的時間算起,直到結束使用變量為止,在這個時間段內的時間就叫作變量的生命周期。這有點類似自然界的春夏秋冬,每年都是從春天開始,直到冬天結束。從春天到冬天的這個過程就是一個周期,只是我們習慣叫這個周期為一年。
C語言中的變量有全局變量和局部變量,全局變量的生命周期和程序的生命周期相同,也就是說全局變量貫穿於整個程序的運行過程。局部變量的生命周期沒有這麼長,它只在需要使用它的時候才開始出現,使用完成後,它完成了自己的使命,進而結束生命。最常見的是函數中的變量,這些變量都是局部變量,它們隨著函數的運行而開始,函數運行結束後,它們也會消失。
接下來我們舉一個實際的例子來說明變量的生命周期:
int globle_value = 1;
void func()
{
int local_value = 3;
printf("globle_value = %d \n",globle_value); //在該函數中可以使用全局變量
printf("local_value = %d \n",local_value); //在該函數中可以使用局部變量
}
int main()
{
func();
printf("globle_value = %d \n",globle_value); //在主函數中可以使用全局變量
//printf("local_value = %d \n",local_value); //在主函數中不能使用局部變量
return 0;
}
我們把上面的代碼保存到一個文件中,並且編譯該文件,然後運行編譯後的程序,程序的運行結果如下:
globle_value = 1 //在func函數中可以使用全局變量
local_value = 3 //在func函數中可以使用全局變量
globle_value = 1 //在main函數中只能使用全局變量
從上面的例子中可以看到,全局變量在自定義的func函數和主函數中都可以被使用,因為它的生命周期和程序的生命周期相同。而局部變量只能在func函數中使用,不能在主函數中使用,如果去掉程序中的注釋那麼就會產生“變量未定義”的編譯錯誤。原因在於局部變量隨著func函數的結束而結束,因此在主函數中看不到局部變量。
變量的作用域表示變量的有效使用范圍,變量在某個范圍內可以被使用,出了這個范圍外就不能被使用了。比如我們日常生活中的身份證,在國內可以隨意使用,但是出國後就不能使用了,只能使用護照。這是因為身份證的作用域是國內,出國後就表示超出了身份證的作用域范圍,這時就不能再使用身份證了。我們還使用上面的例子進行說明:
全局變量globle_value的作用域是整個文件,因此它可以被同一個文件中的func函數和main函數訪問。 局部變量local_value的作用域是函數func內部。因此它只能在func函數內使用,在其它地方不能使用,因為已經超出了它的作用域。有了這些鋪墊後,我們介紹static關鍵字就容易多了,static關鍵字主要有兩個功能:限定變量或者函數的生命周期和作用域。
對於變量來說,static不會影響它的生命周期,只是會把未初始化的變量初始化為0。不過它會縮小變量的作用域,這個對局部變量沒有影響,主要是把全局變量的作用域縮小到一個文件中,比如我們在上面例子中的全局變量globle_value,它可以在其它文件中使用,如果把它使用static關鍵字限定後,它就只能在當前的文件中使用了。
下面是一個實際的例子,請大家參考:
static void func()
{
int temp;
static int static_local_value ;
printf("temp = %d \n",temp); // default value is not known
printf("static_local_value = %d \n",static_local_value); // default value is 0
}
我們在函數func中定義一個普通變量和static修飾的變量,並且都沒有初始化它們。編譯時會把static變量初始化為0,而不會初始化普通變量。下面是程序的運行結果,請參考:
temp = 134513922
static_local_value = 0
從上面的程序運行結果中可以看到,static變量的默認值是0,而普通變量的默認值是不確定的。
對於函數來說,static不會影響它的生命周期,但是會縮小它的作用域,這點和static限定變量時的效果相同,因此,我就不多介紹了。
看官們,完整的代碼放到了我的資源中,大家可以下載使用。
在編寫代碼的時候,我們經常使用static來限定變量和函數,主要是為了把它們的作用域縮小到一個文件內,這樣做可以避免和其它文件中同名的變量或者函數發生命名沖突。
打個比方,據說國內叫張偉的人特別多,也就是說重名的人很多。如果我在這裡叫張偉,那麼可能只有一個看官叫張偉,畢竟在這裡聽我講小說的看官們人數不是很多,如果我在網上發個帖子說:張偉中獎了。那麼可能會有很多叫張偉的人去領獎,如何區分這麼多張偉呢,使用static關鍵字來限定一下就行,哈哈。
各位看官,關於static關鍵字的例子咱們就說到這裡。欲知後面還有什麼例子,且聽下回分解 。