全域性變數與區域性變數以及靜態

2021-10-23 14:33:11 字數 2298 閱讀 1775

目錄

全域性變數、靜態全域性變數、區域性變數、靜態區域性變數

1)從分配記憶體空間來看

2)從作用域來看

【練習題目1】

【練習題目2】

注意:生存週期與作用域的區別

c++變數有6種作用域:全域性作用域,區域性作用域,語句作用域,類作用域,命名作用域和檔案作用域。

區域性變數在棧分配空間。

全域性變數、靜態全域性變數、靜態區域性變數都在靜態儲存區分配空間。

(2.1)全域性變數具有全域性作用域。全域性變數只需在乙個原始檔中定義,就可以作用於所有的原始檔。

(2.2)靜態全域性變數也具有全域性作用域,他與全域性變數的區別在於如果程式包含多個檔案的話,它只能作用於定義它的檔案裡,不能作用到其他檔案裡,即被static關鍵字修飾過的變數具有檔案作用域。這樣即使兩個不同的原始檔都定義了相同的靜態全域性變數,他們也是不同的變數

非靜態全域性變數的作用域是整個源程式,當乙個源程式由多個原始檔組成時,非靜態的全域性變數在各個原始檔中都有效。

靜態全域性變數則限制了其作用域,即只在定義該變數的原始檔內有效,在同一源程式的其他原始檔中不能使用它——可以避免在其他原始檔中引起錯誤。

(2.3)區域性變數只有區域性作用域,只在函式執行期間存在,函式的一次呼叫結束後,變數就被撤銷,其所占用的記憶體也被收回。

(2.4)靜態區域性變數具有區域性作用域。它只被初始化一次,自從第一次初始化直到程式結束都一直存在,它和全域性變數的區別在於全域性變數對所有的函式都可見,而靜態區域性變數只對定義自己的函式體始終可見。

有如下**,請問最後執行完main函式之後,此時的值是多少?

int i=0;    //全域性變數

int cal(int x)

void main(void)

答案:6000

//visual studio 求解原始碼

#include int i = 0;

int cal(int x)

void main(void)

分析:x的值是由區域性變數 j 傳過來的,一直是2000

運算前:x = 2000(區域性變數)   

y= 0

(static靜態區域性變數初始值) 

i=0(全域性變數)

運算後:x = 2000   y= x-y-i=2000-0-0= 

2000

i=0

i1 = 2000

運算前:x = 2000(區域性變數)   y=

2000(static)

i=2000(全域性變數)

運算後:x = 2000   y=x-y-i=2000-2000-2000= 

-2000

i=2000

i2 = -2000

運算前:x = 2000(區域性變數)   y=

-2000(static)

i= -2000(全域性變數)

運算後:x = 2000   y= x-y-i=2000-(-2000)-(-2000)=

6000

i=-2000

i3 = 6000

下面關於變數的描述錯誤的是( )

a.靜態區域性變數在函式內定義,它的生存期為整個源程式      

b.區域性變數存放在記憶體的棧區,在定義它的函式內有效,函式返回後失效

c.靜態區域性變數的作用域仍與自動變數相同,只能在定義該變數的函式內使用      

d.全域性變數本身就是靜態儲存方式,靜態全域性變數與全域性變數沒有本質區別

//舉例說明:在函式test中宣告靜態變數 i 

void test()

分析如下:

區域性變數 m 存放在

棧中,當test函式結束,m 將被銷毀;

靜態區域性變數 i 不存放在棧中,而是存放於程式的全域性變數區域,因此隨著函式test的結束,i 並不隨著出棧操作而被銷毀,它的生存週期存在於程式的整個執行期;

然而 m 和 i 的作用域都僅存在於test函式中它們的定義之後,即test呼叫結束之後,m 和 i 就不再可用,但是 i 仍存在於記憶體之中。

全域性變數 靜態全域性變數 靜態區域性變數 區域性變數

全域性和靜態變數都在堆裡。這句話應該錯了,應該是放在常量資料段 全域性變數的作用範圍是整個程式 如果程式是多個檔案,必須在其他的檔案中說明 靜態變數的作用範圍要看靜態變數的位置,如果在函式裡,則作用範圍 就是這個函式。靜態全域性變數,只在本檔案可以用,雖然整個程式包含多個檔案,但靜態全域性變數只能用...

全域性變數 靜態全域性變數 靜態區域性變數 區域性變數

全域性和靜態變數都在堆裡。全域性變數的作用範圍是整個程式 如果程式是多個檔案,必須在其他的檔案中說明 靜態變數的作用範圍要看靜態變數的位置,如果在函式裡,則作用範圍 就是這個函式。靜態全域性變數,只在本檔案可以用,雖然整個程式包含多個檔案,但靜態全域性變數只能用在定義它的那個檔案裡,卻不能用在程式中...

全域性變數 靜態全域性變數區域性變數 靜態區域性變數

對於乙個完整的程式,在記憶體中的分布情況如下圖 區 low address 全域性資料區 堆區 棧區 high address 一般程式把新產生的動態資料存放在堆區,函式內部的自動變數存放在棧區。自動變數一般會隨著函式的退出而釋放空間,靜態資料 即使是函式內部的靜態區域性變數 也存放在全域性資料區。...