1. 程式人生 > >全域性變數和區域性變數有沒有區別,如果有,是什麼?

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

一、變數的分類

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

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

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

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

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

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

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

二、介紹變數的作用域

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

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

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

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

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

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

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

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

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

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

            例如:int   a,b;

            等效於:

            extern int a,b;

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

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

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