變量的存儲類別

              從作用域的角度來看,變量可以分爲局部變量和全局變量;從生存期(存在時間)的角度來看,變量又分爲靜態存儲和動態存儲。靜態存儲的變量在整個程序運行期間分配固定的存儲空間。動態存儲的變量在程序運行的期間根據需要動態分配空間,函數調用開始爲其分配地址空間,函數調用結束後釋放所佔空間。

       內存中,供C程序使用的存儲空間分爲程序區、靜態存儲區、動態存儲區三部分。程序區專門用於存放源程序(包括函數);靜態存儲區用於存放靜態變量,這些變量在程序編譯階段就已經被分配地址並一次進行初始化了,以後不再進行變量的初始化工作;動態存儲區用於存放動態型變量,這些變量在函數調用階段進行地址分配的,函數調用結束後將自動釋放其所佔的內存空間。

    在C語言中,變量有數據類型和存儲類型兩個屬性。嚴格的來說,變量的定義形式爲:

      變量的存儲類型   變量類型 變量名;

      存儲類別具體爲自動型(auto)、寄存器型(register)、靜態型(static)和外部型四種。

      局部變量的存儲類別

      1.自動型局部變量

      自動型局部變量在動態存儲區分配存儲空間,在調用函數時,系統給他們分配存儲空間,在函數調用結束後就自動釋放這些存儲空間。自動型局部變量用關鍵字auto做類別說明。

       auto float m;

     2.靜態型局部變量

       靜態型局部變量在靜態存儲區分配存儲空間,變量的值在函數調用結束後不消失而保留原值,即其佔用的存儲單元不釋放,在下一次函數調用時,該變量已有值,就是上一次調用結束時的值。靜態型局部變量用關鍵字static做存儲類別說明,例如:

     static int n;

      靜態型局部變量,初始化僅進行一次;在以下情況下使用靜態局部變量。

      (1)需要保留上次函數調用結束時的值

      (2)初始化後,變量只被引用而不改其值;

        靜態型局部變量與動態型局部變量的區別:

      (1)靜態型存儲變量屬於靜態存儲類別,在靜態存儲區分配存儲單元  ,在整個程序運行期間不釋放,但不能被其他函數引用。自動型局部變量屬於動態存儲類別,在動態存儲區分配存儲單元,函數調用結束後即釋放;

       (2)靜態型局部變量在編譯時賦初值,在程序運行時已有初值,以後每次調用函數時不再重新賦初值,只是保留上次調用結束時的值。自動型局部變量在函數調用時賦初值,每次調用一次函數都重新分配存儲單元並賦初值,相當於執行一次賦值語句。

       (3)如果在定義靜態型局部變量時沒有賦初值,編譯程序自動對靜態型局部變量賦初值,數值型變量爲0,字符型變量爲空字符。如果在定義動態型局部變量時沒有賦初值,它的值是不確定的。只是因爲每次函數調用時都重新分配存儲單元,而所分配的的存儲單元的值是不確定的。

       3.寄存器型局部變量

         爲了提高程序的執行效率,C語言允許將局部變量的值放在CPU的通用寄存器中,這種變量稱爲寄存器型局部變量。寄存器型局部變量用關鍵字register做存儲類型說明,例如: register int a,b;

        (1)只有自動型局部變量和形式參數可以說明爲寄存器型變量;

         (2)由於一個計算機系統中寄存器個數是有限的,所以不能定義任意多個寄存器型局部變量。


       全局變量的存儲類型

     全局變量是在函數的外部定義的,編譯時分配在靜態存儲區,在整個程序運行期間都佔有存儲空間。全局變量的作用域爲從變量的定義點開始,到它所在的程序文件的末尾。通過引用聲明可以擴展全局變量的作用域,引用聲明的形式爲:

    extern 變量的類型 變量名;

   從作用域的角度來看,全局變量分爲外部型和靜態型兩種。

  1.靜態型全局變量

    在定義全局變量時,若在類型名前加一個關鍵字static,則說明定義的變量爲靜態型全局變量。通過引用聲明,可以擴展靜態型全局變量的作用域,但是只能在它所在的文件中擴展,不能擴展到程序中其他文件。也就是說,靜態型全局變量只能被它所在的文件中的函數使用,不能被其他文件中的函數使用。如果一個函數要使用它後面的定義的全局變量,則應該在使用前作引用聲明。這樣就將該全局變量的作用域的起始點從定義點到聲明處;

      2.外部型全局變量

      在定義全局變量時,若沒有給出存儲類別,則定義的變量爲外部型全局變量。

      C程序由C源程序文件組成,C源程序文件又由函數組成。通過引用聲明,外部型全局變量的作用域可以擴展到定義它之前的函數,也可以擴展到程序中的其他文件。也就是說,外部型全局變量不但可以被它所在的文件中的函數使用,也可以被其他文件中的函數使用。如果一個文件要使用另一個文件中使用定義的全局變量,則在使用它們的文件中作引用聲明,說明他們是在其他的文件中定義的外部型的全局變量,這樣就可以在該文件中使用其他的文件中定義的外部型的全局變量。         

  

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章