區域性變數和全域性變數(靜態和非靜態)區別
全域性變數和全域性靜態變數的區別
(1)全域性變數是不顯式用 static 修飾的全域性變數,全域性變數預設是有外部連結性的,作用域是整個工程,在一個檔案內定義的全域性變數,在另一個檔案中,通過 extern 全域性變數名的宣告,就可以使用全域性變數。
(2)全域性靜態變數是顯式用 static 修飾的全域性變數,作用域是宣告此變數所在的檔案,其他的檔案即使用 extern 宣告也不能使用。
靜態全域性變數有以下特點:
(1)靜態變數都在全域性資料區分配記憶體,包括後面將要提到的靜態區域性變數;
(2)未經初始化的靜態全域性變數會被程式自動初始化為0(在函式體內宣告的自動變數的值是隨機的,除非它被顯式初始化,而在函式體外被宣告的自動變數也會被初始化為 0);
(3)靜態全域性變數在宣告它的整個檔案都是可見的,而在檔案之外是不可見的。
優點:靜態全域性變數不能被其它檔案所用;其它檔案中可以定義相同名字的變數,不會發生衝突。
普通區域性變數與靜態區域性變數的區別
記憶體分配和釋放
1、普通區域性變數只有執行到變數定義的語句的時候才分配空間。
2、static區域性變數在編譯階段(函式還沒有執行),變數的空間已經分配。
3、普通區域性變數離開作用域{},自動釋放其空間,也就無法使用此變數。
4、static區域性變數只有在整個程式結束的時候才將其自動釋放。
初始化
1、普通區域性變數不初始化,為隨機值。
2、static區域性變數不初始化,為0。
3、static區域性變數初始化語句只有第一次執行時有效,但是可以賦值多次。
4、static區域性變數只能用它常量初始化。
靜態區域性變數有以下特點:
(1)該變數在全域性資料區分配記憶體;
(2)靜態區域性變數在程式執行到該物件的宣告處時被首次初始化,即以後的函式呼叫不再進行初始化;
(3)靜態區域性變數一般在宣告處初始化,如果沒有顯式初始化,會被程式自動初始化為 0;
(4)它始終駐留在全域性資料區,直到程式執行結束。但其作用域為區域性作用域,當定義它的函式或語句塊結束時,其作用域隨之結束。(延長了區域性變數的生命週期)
相關文章
- C語言區域性變數、全域性變數、靜態區域性變數、靜態全域性變數C語言變數
- 全域性變數和靜態變數的區別變數
- 靜態全域性變數和全域性變數變數
- 成員變數、全域性變數、例項變數、類變數、靜態變數和區域性變數的區別變數
- 靜態變數和非靜態變數變數
- 記憶體分配知識(全域性,區域性,靜態變數)記憶體變數
- C語言--靜態區域性變數C語言變數
- 區域性變數和全域性變數變數
- 靜態變數和例項變數區別?變數
- java 全域性變數和區域性變數Java變數
- JavaScript —— 區域性變數和全域性變數JavaScript變數
- jmeter全域性變數和區域性變數JMeter變數
- iOS 靜變數static、全域性變數extern、區域性變數、例項變數iOS變數
- python全域性變數和區域性變數, globalPython變數
- javascript中的作用域(全域性變數和區域性變數)JavaScript變數
- 區域性靜態變數的初始化觀測變數
- 全域性變數與區域性變數變數
- Python中的全域性變數和區域性變數Python變數
- js-js的全域性變數和區域性變數JS變數
- Python的全域性和區域性變數Python變數
- Java區域性變數與全域性變數Java變數
- 【c】全域性變數與區域性變數變數
- Python的區域性變數和全域性變數使用解惑Python變數
- 成員變數和區域性變數的區別變數
- java執行緒安全問題之靜態變數、例項變數、區域性變數Java執行緒變數
- python全域性變數與區域性變數Python變數
- 靜態變數和Session變數Session
- JavaScript五:全域性變數&區域性變數;運算子JavaScript變數
- 成員變數和區域性變數變數
- Python全域性變數與區域性變數詳解Python變數
- 詳解python 區域性變數與全域性變數Python變數
- Java基礎-成員變數和區域性變數的區別Java變數
- 理解靜態區域性變數(static)在程式中的執行規則變數
- 靜態變數變數
- 靜態內部類和非靜態內部類區別
- 靜態變數與靜態方法變數
- 記一個全域性變數"冒充"區域性變數引起的bug變數
- 偽靜態、靜態和動態的區別