static與全局變量相關總結

按變量的作用域分類:

    1.局部變量:在函數內定義的變量,作用域僅限於函數內。

    2.全局變量:定義在函數之外的變量,它的作用域從定義處開始,到所在文件的結束。作用域是所在的整個文件。

    3.外部變量:一個文件中的全局變量可以在另一個文件中作爲外部變量使用,某個文件中引用另一個文件中的全局變量。用extern聲明,說明這個變量是在其他文件中已經定義過的外部變量。那麼,該文件不會爲外部變量分配內存。

       extern 類型說明符   外部變量名;

       extern  int  student;

      注意:全局變量是外部變量;


按變量的存儲方式分類:

    1.靜態存儲變量:變量定義時就分配存儲單元並一直保持不變,直至整個程序結束。  

                                   全局變量屬於此類存儲方式。

                                   靜態變量的類型說明符爲:static

                                                   靜態變量當然是屬於靜態存儲方式,但是,屬於靜態存儲方式的變量不一定是靜態變量,如外部變量。

  •                                                   靜態局部變量

                                                                              (1)在局部變量的說明前加上static說明符就構成。

                                                                              (2)生存期:靜態局部變量在函數內定義,但它的生存期是整個程序

                                                                              (3)作用域:靜態局部變量的生存期雖然爲整個程序,但其作用域仍與自動變量相同。只能在定義該變量的函數內使用。退出該函數後, 儘管該變量還繼續存在,但不能使用它。

                                                                              (4)初始化:賦初值,若未賦初值,則由系統自動賦0值。

                                                                              (5)只在第一次調用函數時給賦初值,再次調用定義它的函數時,靜態局部變量保存了前一次被調用後留下的值。因此,靜態變量用在:多次調用一個函數且要求在調用之間保留某些變量的值時。

  •                                                    靜態全局變量:

                                                                               (1)在全局變量的說明之前加上static。

                                                                               (2)內存中的位置:靜態存儲區(靜態存儲區在整個程序運行期間都存在)

                                                                               (2)全局變量本身就是靜態存儲方式,靜態全局變量當然也是靜態存儲方式,區別在作用域上:非靜態全局變量作用域可以擴展到整個源程序,靜態全局變量則侷限於一個源文件內,只能爲該源文件內的函數公用。因此,全局變量加上static的限制,是爲了避免在其他源文件中引用,限制他不能作爲另一個文件的外部變量,防止出現錯誤。

         

                                                  總結:局部變量加上static,改變了他的存儲方式和生存期。

                                                              全局變量加上static,限制了作用域,使用範圍。

                                                             static這個說明符在不同的地方所起的作用是不同的。


注:當static用來修飾局部變量的時候,它就改變了局部變量的存儲位置,從原來的中存放改爲靜態存儲區。但是局部靜態變量在離開作用域之後,並沒有被銷燬,而是仍然駐留在內存當中,直到程序結束,只不過我們不能再對他進行訪問。


    2.動態存儲變量:程序執行過程中,使用它時才分配存儲單元,使用完立即釋放。

                                   eg:函數的形參,在函數定義時並不給形參分配存儲單元,只是在函數被調用時,才予以分配,函數調用完立即釋放。如果一個函數被多次調用,則會多次分配和釋放形參變量的存儲單元。

                                   自動變量是動態存儲方式。 自動變量類型說明符爲:auto

                                                    凡未加存儲類型說明的變量均視爲自動變量

                                                   注意:自動變量的作用域僅限於定義該變量的結構(函數或複合語句)內。


static函數(內部函數/靜態函數)

在函數的返回類型前加上關鍵字static,函數就被定義成爲靜態函數。
函數的定義和聲明默認情況下是extern的,但靜態函數只是在聲明他的文件當中可見,不能被其他文件所用。關鍵字“static”,譯成中文就是“靜態的”,所以內部函數又稱靜態函數。但此處“static”的含義不是指存儲方式,而是指對函數的作用域僅侷限於本文件。 

靜態函數會被自動分配在一個一直使用的存儲區,直到退出應用程序實例,避免了調用函數時壓棧出棧,速度快很多。

使用內部函數的好處是:
定義靜態函數的好處:

<1> 其他文件中可以定義相同名字的函數,不會發生衝突。不同的人編寫不同的函數時,不用擔心自己定義的函數,是否會與其它文件中的函數同名,因爲同名也沒有關係。 
<2> 靜態函數不能被其他文件所用。 


補充鏈接:http://blog.163.com/sunshine_linting/blog/static/44893323201191294825184/

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章