變數的儲存型別

2021-04-30 08:23:11 字數 1071 閱讀 2767

曾巨集安,

華清遠見嵌入式學院

講師。我們在程式中會經常定義一些變數來儲存和處理資料。從本質上看,變數代表了一段可操作的記憶體,也可以認為變數是記憶體的符號化表示。當程式中需要使用記憶體時,可以定義某種型別的變數。此時編譯器根據變數的資料型別分配一定大小的記憶體空間。程式就可以通過變數名來訪問對應的記憶體了。

如果說變數的資料型別決定了對應記憶體的大小,那麼儲存型別則影響著對應記憶體的使用方式。所謂使用方式,具體說就是在什麼時間、程式的什麼地方可以使用變數,即變數的生命週期和作用域。

先了解一些基本常識。一、在程式執行時記憶體中有三個區域可以儲存變數:靜態儲存區、棧(stack)和堆(heap)。二、根據變數定義的位置可分為全域性變數(定義在函式體外的變數)和區域性變數(定義在函式體內的變數,包括形參)。

所有的全域性變數和靜態區域性變數(定義時使用關鍵字static)都儲存在靜態儲存區,其特點是:在編譯時分配記憶體空間並進行初始化。在程式執行期間,變數一直存在,直到程式結束,變數對應的記憶體空間才被釋放。

而所有的非靜態區域性變數(又稱為自動變數)儲存在棧(stack)中,其特點是:在變數所在的函式或模組被執行時動態建立,函式或模組執行完時,變數對應的記憶體空間被釋放。換句話說,函式或模組每被執行一次,區域性變數就會重新被分配空間。如果變數定義時沒有初始化,那麼變數中的值是隨機數。

所有用malloc分配的記憶體(又稱為動態記憶體)都在堆(heap)中,其特點是:一般通過指標來訪問動態分配的記憶體。即可以通過free來手動釋放動態記憶體,也可以在程式結束時由系統自動釋放。

以上討論的是變數的生命週期,下面來看作用域。作用域指的是變數的可見範圍,即在變數的生命週期內,程式的哪些部分可以使用該變數。

全域性變數的作用域從定義點開始一直到原始檔的結束。如果要在定義點之前使用全域性變數的話就需要使用關鍵字extern對作用域進行擴充套件。全域性變數預設是可以被其他檔案引用的。如果希望僅限於本檔案使用的話,需要在定義時使用關鍵字static。

對於區域性變數來說,無論是靜態區域性變數還是自動變數,作用域都僅限於定義該變數的函式或模組。

動態記憶體只要沒有被釋放就可以在程式的任何地方使用,前提是要知道動態記憶體的位址。

注:static加在全域性變數前影響的是作用域,加在區域性變數前影響的是生命週期。

變數的儲存型別

儲存型別是從變數的存在時間 即生存期 來劃分變數。變數的儲存型別可分為靜態儲存方式和動態儲存方式。對於動態儲存變數,當程式執行到該變數處時才為其分配儲存空間,當程式執行到該變數所在作用域的結束處時自動收回為其分配的儲存空間,因此它的生存期為所在作用域。在程式開始就執行就為其分配儲存空間,直到程式結束...

變數的儲存型別

變數的儲存型別有兩種 動態和靜態,其中又有四種基本型別 auto,static,register,extern auto便是經常在函式中碰到的那些區域性變數,關鍵字auto可省略,定義register變數就是為了提高對資料的訪問速度,只有區域性自動變數或形參可以這麼定義,下面就static和exte...

變數的儲存型別

變數的儲存型別有4種,分別是static external register auto,對於每一種儲存型別,他們都有相應的使用方式和特點,下面就分別對這四種儲存型別介紹一下 1.static靜態型 可以修飾區域性變數 全域性變數 函式 a.存放在靜態區,靜態區的資料未初始化時,由系統給該變數賦初值,...