全域性變數和區域性變數有沒有區別,如果有,是什麼?

2021-07-10 23:10:29 字數 1576 閱讀 3358

一、變數的分類

變數可以分為:全域性變數、靜態全域性變數、靜態區域性變數和靜態變數。

按儲存區域分,全域性變數、靜態全域性變數、靜態區域性變數都存放在記憶體的靜態儲存區域,區域性變數存放在記憶體的棧區。

按作用域分,全域性變數在整個工程檔案內都有效;靜態全域性變數只在定義它的檔案內有效;靜態區域性變數只在定義它的函式內有效,只是程式僅分配一次記憶體,函式返回後,該變數不會消失;區域性變數在定義它的函式內有效,但函式返回後失效。

全域性變數和靜態變數如果沒有手工初始化,則由編譯器初始化為0。區域性變數的值不可知。

全域性變數是沒有定義儲存型別的外部變數,其作用域是從定義點到程式結束。省略了儲存型別符,預設是自動型。

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

自動型變數存放在堆疊區中。堆疊區也是記憶體中的一部分,該部分內存在程式執行中是重複使用的。

二、介紹變數的作用域

1、區域性變數。區域性變數也稱為內部變數。區域性變數是在函式內作定義說明的。其作用域僅限於函式內,離開該函式後再使用這種變數是非法的。

關於區域性變數的作用域還要說明以下幾點:

(1)主函式中定義的變數也只能在主函式中使用,不能在其他函式中使用。同時,主函式中也不能使用其他函式中定義的變數。因為主函式也是乙個函式,它與其他函式是平行關係。這一點與其它語言不同,應予以注意。

(2)形參變數是屬於被調函式的區域性變數,實參變數是屬於主調函式的區域性變數。

(3)允許在不同的函式中使用相同的變數名,它們代表不同的物件,分配不同的單元,互不干擾,也不會發生混淆。

(4)在復合語句中也可以定義變數,其作用域只在復合語句範圍內。

2、全域性變數。全域性變數也稱為外部變數,它是在函式外部定義的變數。它不屬於乙個函式,它屬於乙個源程式檔案,其總用域是整個源程式。在函式中使用全域性變數,一般應作全域性變數說明。只有在函式內經過說明的全域性變數才能使用。全域性變數的說明符為extern。但在乙個函式之前定義的全域性變數,在該函式內不可再加以說明。

對於全域性變數還有以下幾點說明:

(1)對於全域性變數的定義和說明,可以不加區分。而對於外部變數則不然,外部變數的定義和外部變數的說明並不是一回事。外部變數定義必須在所有函式之外,且只能定義一次。其一般形式為:

[extern] 型別說明符 變數名,變數名...其中方括號內的extern可以省去不寫。

例如:int   a,b;

等效於:

extern int a,b;

而外部變數說明出現在要使用該外部變數的各個函式內,在整個程式內,可能出現多次,外部變數說明的一般形式為:extern 型別說明符 變數名,變數名,...;外部變數在定義時就已分配了記憶體單元,外部變數定義可做初始賦值,外部變數說明不能再被賦初值,只是表明在函式內要使用某外部變數。

(2)外部變數可加強函式模組之間的資料聯絡,但是又使函式要依賴這些變數,從模組化程式設計的觀點來看這是不利的,因此不必要時盡量不要使用全域性變數。

(3)在同一原始檔中,允許全域性變數和區域性變數同名。在區域性變數的作用域內,全域性變數不起作用。

全域性變數和區域性變數

全域性變數 可以被不同的函式 類或檔案呼叫的變數,在函式外定義。區域性變數 只能在函式內使用,定義在函式內。區域性變數的使用 class myclass def myfun num 12 print myfun num num 正確 def myfun2 num num 1 print mufun ...

全域性變數和區域性變數

區域性變數 在方法中開闢的變數,只在方法中有效 區域性變數在定義時不會初始化,要顯式的給它乙個值 如未給它乙個初始值,雖然編譯的時候會通過,但是執行的時候會產生為初始化錯誤!方法呼叫 執行完,區域性變數便會自動釋放。在方法內的語句塊中建立的變數在編譯時假如未初始,如若使用,也會報未初始化錯誤!呼叫的...

全域性變數和區域性變數

通常的認為是定義在函式外面的就稱之為全域性變數 函式體內的稱之為區域性變數 在函式中與全域性變數同名的時候 情形1 函式內部的變數名如果第一次出現,且出現在 前面,即被視為定義乙個區域性變數。num 100 定義乙個全域性變數 defdemo num 100 這裡面的實際上是定義了乙個區域性的變數 ...