天天看點

全面深入認識C變量

變量是C語言最基礎也是最核心的概念,C的變量比較複雜,這裡做個總結,希望對學習C的兄弟們有幫助。

一、認識變量

變量字面含義是表示一個可變的資料,資料有各種各樣的類型,變量的類型指定了變量所能表示的資料類型。

從存儲角度認識變量的本質,舉例來說:

char c = 'x';

這個語句定義了一個char變量c,變量的值為字母120(字母x的ASCII碼值為120),這個變量存儲在計算機的某塊記憶體區域,其存儲單元的位址(編号)假設為0x1101。

變量名c實質就是記憶體單元位址0x1101的一個符号,c代表的記憶體位址為0x1101。

當使用變量c時候,其本質是通路所對應的記憶體單元。

變量之是以能改變,是因為記憶體中資料是可以改變的,是以稱之為變量。

如果你對計算機以上的内容還不了解,請看《計算機組成原理》。

實際上學習計算機組成原理,是學習彙編和C語言先行課程,可是大學裡面往往颠倒了,誤導了一批又一批的高材生。

二、從時空角度來認識變量分類

剛學C語言的時候,往往會有很多疑問,寄存器變量,全局變量等等,尤其是這些概念交叉起來外部寄存器變量,初學者就暈菜了。

實際上變量是有其時空特性的。簡單說就是:

從作用域(空間)角度來劃分,可分為全局變量和局部變量。

從存儲類型(生命周期/時間)角度劃分,可分為靜态存儲方式和動态存儲方式。

另外,從變量的表達值類型劃分,類型很多很多,一般說的int類型變量,就是這個意思。

三、認識變量的存儲類型

為了認識存儲類型,需要了解C語言程式記憶體區域的劃分,一般劃分為以下五大部分:

1、棧區(Stack):棧是由編譯器自動配置設定和釋放的記憶體區域,用于存放局部變量(包括方法的參數等)。棧區裡的變量個數和變量的值會随着程式的運作而改變。

2、堆區(Heap):程式員通過C的函數(比如malloc)申請的記憶體區域,使用完畢後釋放(或由OS自動釋放)。

3、全局區(靜态區(Static):這本記憶體區域用來儲存全局變量和靜态變量。在進入程式時配置設定,程式結束後由系統釋放,整個程式運作期間一直存在。

4、文字常量區:用來儲存常量字元串的記憶體區域,程式結束後,由系統釋放。

5、程式代碼區:用來儲存程式二進制代碼的記憶體區域。

四、C變量存儲類型關鍵字

C變量存儲類型描述關鍵字有四:

1、auto 自動變量

屬局部變量,動态存儲。auto可省略,系統不為其進行預設初始化,未初始化的靜态變量指向一個不可預期的、無意義的值。

2、register 寄存器變量

與auto一樣,屬局部變量,動态存儲。但存儲的位置在CPU内。不能對變量使用取位址運算符(&),因為寄存器變量的存儲沒有記憶體位址。

3、extern 外部變量

定義在函數外,也叫全局變量,使用靜态存儲方式儲存在全局區( 靜态區)。

外部變量和全局變量是對同一類型變量的兩種不同角度的法。全集變量時從他的作用域角度提出的,外部變量時從他的存儲方式提出的,表示其生命周期。

4、static 靜态變量

存儲于靜态區,可分為靜态全局(或外部)和靜态局部(或内部)兩種類型。對于基本類型的靜态局部變量,系統會自動為其賦初值0(與外部變量相同)。

但屬于靜态存儲方式的變量不一定就是靜态變量,外部變量(全局變量)也屬于靜态存儲方式,但外部變量不一定是靜态變量。

注意:對于寄存器變量,很多C編譯器并沒有真正将寄存器變量放到CPU内部,而是作為自動變量處理。使用register隻是提示編譯器将變量定義為寄存器變量,期望編譯器将其作為寄存器變量,但不一定能達到期望。因為要看編譯器是否支援了,其次看看CPU内部是否有可用寄存器空間。

本文轉自 leizhimin 51CTO部落格,原文連結:http://blog.51cto.com/lavasoft/186951,如需轉載請自行聯系原作者

繼續閱讀