C語言中的變量根據其生存周期,可以分為靜態存儲方式和動態存儲方式。
靜態存儲方式:是指在程序運行期間分配固定的存儲空間的方式。靜態存儲區中存放了在整個程序執行過程中都存在的變量,如全局變量。
動態存儲方式:是指在程序運行期間根據需要進行動態的分配存儲空間的方式。動態存儲區中存放的變量是根據程序運行的需要而建立和釋放的,通常包括:自動變量;函數形參;函數調用時的現場保護和返回地址等。
靜態分配和動態分配的區別主要是兩個:
時間不同:靜態分配發生在程序編譯和連接的時候,動態分配則發生在程序調入和執行的時候。
空間不同:堆都是動態分配的,沒有靜態分配的堆。動態分配由函數malloc進行分配(需要注意的是有一個malloc,就有一個free對應)。棧有2種分配方式:靜態分配和動態分配。靜態分配是編譯器完成的,比如局部變量的分配。不過棧的動態分配和堆不同,它的動態分配是由編譯器進行釋放,無需人工實現。
C語言的內存分配方式:堆和棧
變量示例
C語言中的變量具體包含有四種:自動的(auto),靜態的(static),寄存器的(register),外部的(extern),如果不加以聲明,則認為是auto型,自動分配存儲空間,屬于動態存儲方式。
Static聲明局部變量是在函數調用結束后不消失而保留原值,即占用存儲單元不釋放,在下一次調用該函數時,該變量保持上次函數調用結束時的值。Static在對全局變量聲明中,該變量的作用域則僅限于本文件模塊操作。
Register變量是C語言中允許將局部變量的值放在CPU中的寄存器中需要時直接從寄存器中取出來參加運算,不必再到內存中提取,但是計算機系統中寄存器數量有限,不能任意定義任意多的存儲器,局部靜態變量不能定義為寄存器變量。
寄存器是最貼近CPU的,而且CPU只在寄存器中進行存取。寄存的意思是暫時存放數據,不用每次都從內存中取,它是一個臨時的存放數據的空間。
關于寄存器變量有以下事項需要注意:
為寄存器變量分配寄存器是動態完成的,因此,只有局部變量和形式參數才能定義為寄存器變量。
寄存器的長度一般和機器的字長一致,所以,只有較短的類型如int、char、short等才適合定義為寄存器變量,諸如double等較大的類型,不推薦將其定義為寄存器類型。
CPU的寄存器數目有限,因此,即使定義了寄存器變量,編譯器可能并不真正為其分配寄存器,而是將其當做普通的auto變量來對待,為其分配棧內存。當然,有些優秀的編譯器,能自動識別使用頻繁的變量,如循環控制變量等,在有可用的寄存器時,即使沒有使用 register 關鍵字,也自動為其分配寄存器,無須由程序員來指定。
計算機系統的硬件組織:總線、IO、主存、CPU
Extern聲明外部變量,表示變量在別的文件中。在一個文件中,如果定義之前的函數想引用該外部變量,則應該在引用之前用關鍵字extern對該變量做外部變量聲明。在多文件中,也可以采用extern聲明的辦法進行外部變量聲明。有時希望某些局部變量只限于被本文件引用,而不能被其他文件引用,這時就可以采用在定義外部變量時外加一個static,這在程序模塊化設計中加強了通用性。
-
C語言
+關注
關注
180文章
7614瀏覽量
137703 -
函數
+關注
關注
3文章
4346瀏覽量
62968 -
變量
+關注
關注
0文章
613瀏覽量
28463
發布評論請先 登錄
相關推薦
評論