全面深入認識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內部是否有可用寄存器空間。
本文出自 “熔 巖” 博客,請務必保留此出處http://lavasoft.blog.51cto.com/62575/186951