按變量的作用域分類:
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/