天天看點

C語言中static修飾函數和變量用法static修飾函數,局部變量和全局變量的用法

static修飾函數,局部變量和全局變量的用法

在c語言中static關鍵字可以修飾函數和變量。修飾變量又可以分為修飾全局變量和局部變量。static作用是限定變量的生命周期,限定變量或函數的作用域。

寫在前面:

變量的生命周期是指,相對于程式運作的程序生命周期,變量存在的時間段。變量的生命周期由變量的存儲類型(位置)決定。是以static的第1種含義也可以了解為,static定義了變量的存儲類型(位置)。

C語言中,變量存儲位置分為棧、全局靜态區、堆。棧用來做函數調用,參數傳遞等,在程式的運作過程中是操作最頻繁的資料區。全局靜态區,是變量一直存在于記憶體中,在程式整個運作過程中不會被銷毀。堆,是由作業系統維護的大空間記憶體伸縮區,程序可以主動向作業系統申請使用堆的存儲,在程式運作過程中動态申請。

由static修飾的變量,其存儲類型為全局靜态區,變量在程式的整個運作過程中不會被銷毀,并且隻會被初始化1次。

1,加static修飾的局部變量和普通局部變量

寫個代碼舉個例子

#include <stdio.h>
void func1()
{
    static int var1 = 1;        // 在全局靜态區配置設定變量var1的存儲空間
    int var2 = 1;        // 在棧上配置設定var2的存儲空間

    var1 = var1+1;    
    var2 = var2+1;

    printf("var1=%d, var2=%d\n", var1, var2);
}

int main(int argc, char *argv[])
{
    func1();
    func1();
    func1();
}
           

代碼輸出:

“var1=2, var2=2”

“var1=3, var2=2”

“var1=4, var2=2”

說明被static修飾的局部變量生命周期是整個程式,但是作用域是和局部變量一樣的,從定義開始,到最近的花括号結束

2,加static修飾的全局變量和普通全局變量差別

全局變量預設對其他聲明檔案來說是可見,可用的。在一個檔案引用了另一個檔案之後就可以使用這個檔案的全局變量。static會限定全局變量的可見域,隻在本檔案的任何地方可以通路,但是對于其他檔案是不可見的。

3,static修飾函數

在函數的傳回類型前加上關鍵字static,函數就被定義成為靜态函數。

  函數的定義和聲明預設情況下是extern的,但靜态函數隻是在聲明他的檔案當中可見,不能被其他檔案所用。好處:

  <1> 其他檔案中可以定義相同名字的函數,不會發生沖突

  <2> 靜态函數不能被其他檔案所用。 存儲說明符auto,register,extern,static,對應兩種存儲期:自動存儲期和靜态存儲期。 auto和register對應自動存儲期。具有自動存儲期的變量在進入聲明該變量的程式塊時被建立,它在該程式塊活動時存在,退出該程式塊時撤銷。

  關鍵字extern和static用來說明具有靜态存儲期的變量和函數。用static聲明的局部變量具有靜态存儲持續期(static storage duration),或靜态範圍(static extent)。雖然他的值在函數調用之間保持有效,但是其名字的可視性仍限制在其局部域内。靜态局部對象在程式執行到該對象的聲明處時被首次初始化。

4, 總結

關鍵字“static”,譯成中文就是“靜态的”,是以内部函數又稱靜态函數。但此處“static”的含義不是指存儲方式,而是指對函數的作用域僅局限于本檔案。 使用内部函數的好處是:不同的人編寫不同的函數時,不用擔心自己定義的函數,是否會與其它檔案中的函數同名,因為同名也沒有關系。

  static在c裡面可以用來修飾變量,也可以用來修飾函數。 用來修飾變量的時候。變量在c裡面可分為存在全局資料區、棧和堆裡。其實我們平時所說的堆棧是棧而不包含堆,不要弄混。

  c語言中static的語義

    1.static變量:

      1).局部變量。

        a.靜态局部變量在函數内定義,生存期為整個源程式,但作用域與自動變量相同,隻能在定義該變量的函數内使用。退出該函數後, 盡管該變量還繼續存在,但不能使用它。

        b.對基本類型的靜态局部變量若在說明時未賦以初值,則系統自動賦予0值。而對自動變量不賦初值,則其值是不定的。      

      2).全局變量。

        全局變量本身就是靜态存儲方式, 靜态全局變量當然也是靜态存儲方式。但是他們的作用域,非靜态全局變量的作用域是整個源程式(多個源檔案可以共同使用); 而靜态全局變量則限制了其作用域, 即隻在定義該變量的源檔案内有效, 在同一源程式的其它源檔案中不能使用它。

    2.static函數(也叫内部函數)

      隻能被本檔案中的函數調用,而不能被同一程式其它檔案中的函數調用。差別于一般的非靜态函數(外部函數)。

繼續閱讀