程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> 一起talk C栗子吧(第一百二十六回:C語言實例--static關鍵字)

一起talk C栗子吧(第一百二十六回:C語言實例--static關鍵字)

編輯:關於C語言

一起talk C栗子吧(第一百二十六回:C語言實例--static關鍵字)


各位看官們,大家好,上一回中咱們說的內置宏的例子,這一回咱們說的例子是: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關鍵字的例子咱們就說到這裡。欲知後面還有什麼例子,且聽下回分解 。


  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved