區域性變數和全域性變數(靜態和非靜態)區別
全域性變數和全域性靜態變數的區別
(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語言變數
- 區域性變數和全域性變數變數
- java 全域性變數和區域性變數Java變數
- jmeter全域性變數和區域性變數JMeter變數
- Python中的全域性變數和區域性變數Python變數
- 區域性靜態變數的初始化觀測變數
- javascript中的作用域(全域性變數和區域性變數)JavaScript變數
- js-js的全域性變數和區域性變數JS變數
- 全域性變數與區域性變數變數
- Java區域性變數與全域性變數Java變數
- 【c】全域性變數與區域性變數變數
- java執行緒安全問題之靜態變數、例項變數、區域性變數Java執行緒變數
- 成員變數和區域性變數變數
- JavaScript五:全域性變數&區域性變數;運算子JavaScript變數
- 理解靜態區域性變數(static)在程式中的執行規則變數
- 偽靜態、靜態和動態的區別
- 靜態變數變數
- 修改全域性變數時,可變型別和不可變型別的區別變數型別
- JavaScript全域性作用域下,變數加var和不加var的區別。JavaScript變數
- Python中類變數、成員變數、區域性變數的區別Python變數
- 類的靜態成員變數和普通成員變數該怎樣去區別定義變數
- 可汗學院使用Go靜態上下文理順全域性變數和依賴 - khanacademyGo變數
- CodeSysV3.5 在封裝靜態庫時,隱藏全域性變數。封裝變數
- Dll堆疊問題(Dll的靜態變數與全域性變數、vs的MT與MD)變數
- 【C++】靜態持續變數?如何建立靜態持續變數?C++變數
- 對於systemverilog靜態變數和動態變數 ,描述不正確的是()。變數
- 類,物件,成員變數和區域性變數,匿名物件物件變數
- Java中靜態跟非靜態的區別總結Java
- c#物件導向- 靜態成員和非靜態成員的區別C#物件
- 函式之定義及全域性變數&區域性變數&風溼理論函式變數
- 十二、變數作用域:區域性變數、全域性變數,函式版名片管理系統—新增函式文件變數函式
- 靜態SDRAM和動態SDRAM的區別
- 多執行緒中,區域性變數與全域性變數哪個比較安全?執行緒變數
- vue定義全域性變數和全域性方法Vue變數
- c 語言中巨集定義和定義全域性變數的區別變數
- vue.js全域性元件和區域性元件區別Vue.js元件
- Java靜態變數在靜態方法內部無法改變值Java變數