區域性變數 全域性變數和靜態變數的含義和區別

2021-07-26 17:06:57 字數 1771 閱讀 3719

(1)區域性變數 

在乙個函式內部定義的變數是內部變數,它只在本函式範圍內有效,也就是說只有在本函式內才能使用它們,在此函式以外時不能使用這些變數的,它們稱為區域性變數.

1.主函式main中定義的變數也只在主函式中有效,而不因為在主函式中定義而在整個檔案或程式中有效.

2.不同函式中可以使用名字相同的變數,它們代表不同的物件,互不干擾.

3.形式引數也使區域性變數.

4.在乙個函式內部,可以在復合語句中定義變數,這些變數只在本符合語句中有效.

(2)全域性變數

在函式外定義的變數是外部變數,外部變數是全域性變數,全域性變數可以為本檔案中其它函式所共用,它的有效範圍從定義變數的位置開始到本原始檔結束.

1.設全域性變數的作用:增加了函式間資料聯絡的渠道.

2.建議不再必要的時候不要使用全域性變數,因為

a.全域性變數在程式的全部執行過程中都占用儲存單元.

b.它使函式的通用性降低了c.使用全域性變數過多,會降低程式的清晰性.

3.如果外部變數在檔案開頭定義,則在整個檔案範圍內都可以使用該外部變數,如果不再檔案開頭定義,按上面規定作用範圍只限於定義點到檔案終了.如果在定義點之前的函式想引用該外部變數,則應該在該函式中用關鍵字extern作外部變數說明.

4.如果在同乙個原始檔中,外部變數與區域性變數同名,則在區域性變數的作用範圍內,外部變數不起作用.

(3)靜態變數 

靜態變數的作用範圍要看靜態變數的位置,如果在函式裡,則作用範圍就是這個函式.

靜態全域性變數,只在本檔案可以用,雖然整個程式包含多個檔案,但靜態全域性變數只能用在定義它的那個檔案裡,卻不能用在程式中的其他檔案裡.它是定義儲存因型為靜態型的外部變數,其作用域是從定義點到程式結束,所不同的是儲存型別決定了儲存地點,靜態型變數是存放在記憶體的資料區中的,它們在程式開始執行前就分配了固定的位元組,在程式執行過程中被分配的位元組大小是不改變的,只有程式執行結束後,才釋放所占用的記憶體.

attention

作業系統和編譯器如何判斷全域性變數和區域性變數?

作業系統和編譯器是根據程式執行的記憶體區域來獲取該變數的型別.程式的全域性資料放在所分配記憶體的全域性資料區,程式的區域性資料放在棧區.   

attention

<1>static全域性變數與普通的全域性變數有什麼區別?

全域性變數(外部變數)的說明之前再冠以static 就構成了靜態的全域性變數。全域性變數本身就是靜態儲存方式, 靜態全域性變數當然也是靜態儲存方式.這兩者在儲存方式上並無不同。這兩者的區別雖在於非靜態全域性變數的作用域是整個源程式,當乙個源程式由多個原始檔組成時,非靜態的全域性變數在各個原始檔中都是有效的.而靜態全域性變數則限制了其作用域, 即只在定義該變數的原始檔內有效, 在同一源程式的其它原始檔中不能使用它.由於靜態全域性變數的作用域侷限於乙個原始檔內,只能為該原始檔內的函式公用,因此可以避免在其它原始檔中引起錯誤.從以上分析可以看出, 把區域性變數改變為靜態變數後是改變了它的儲存方式即改變了它的生存期。把全域性變數改變為靜態變數後是改變了它的作用域, 限制了它的使用範圍.

<2>static函式與普通函式有什麼區別?

static函式與普通函式作用域不同.僅在本檔案。只在當前原始檔中使用的函式應該說明為內部函式(static),內部函式應該在當前原始檔中說明和定義.對於可在當前原始檔以外使用的函式,應該在乙個標頭檔案中說明,要使用這些函式的原始檔要包含這個標頭檔案.

<3>static區域性變數和普通區域性變數有什麼區別?

static區域性變數只被初始化一次,下一次依據上一次結果值;

區域性變數,區域性靜態變數,全域性變數,全域性靜態變數分別

c 記憶體到底分幾個區?一 1 棧區 stack 由編譯器自動分配釋放 存放函式的引數值,區域性變數的值等。其操作方式類似於資料結構中的棧。2 堆區 heap 一般由程式設計師分配釋放,若程式設計師不釋放,程式結束時可能由os 注意它與資料結構中的堆是兩回事,分配方式倒是類似於鍊錶,呵呵。3 全域性...

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

變數可以分為全域性變數 靜態全域性變數 靜態區域性變數和區域性變數。按照儲存區分 全域性變數 靜態全域性變數和靜態區域性變數都存放在記憶體的全域性資料區,區域性變數存放在記憶體的棧區。按作用域分 全域性變數在整個工程檔案內都有效 靜態全域性變數只在定義它的檔案內有效 靜態區域性變數只在定義它的函式內...

區域性變數,區域性靜態變數,全域性變數,全域性靜態變數分別

c 記憶體到底分幾個區?一 1 棧區 stack 由編譯器自動分配釋放 存放函式的引數值,區域性變數的值等。其操作方式類似於資料結構中的棧。2 堆區 heap 一般由程式設計師分配釋放,若程式設計師不釋放,程式結束時可能由os 注意它與資料結構中的堆是兩回事,分配方式倒是類似於鍊錶,呵呵。3 全域性...