
作者:呂老師,華清遠見教育科技集團講師。
變量是C語言基礎(chǔ)也是核心的概念,對于初學C語言的同學來說變量的存儲總是覺得比較混亂。這里對C的變量做一個簡單的小結(jié),希望對大家有所幫助。
我們看到對變量的講解的時候看到很多概念,屬性,存儲期,內(nèi)部鏈接,外部鏈接,空鏈接,全局變量,局部變量,寄存器變量,靜態(tài)變量等等。看起來很混亂,下面我們梳理一下。
其實我們再使用變量的時候大多關(guān)心的只有三個方面:變量的存在期,變量的類型,變量的作用域。
我們想一下變量的定義方法分為三部分:
<存儲類別> <變量的數(shù)據(jù)類型> <變量名>
分別理解一下
變量名。這個非常簡單我們只要符合變量的命名規(guī)則就可以了,數(shù)字字母下劃線組成,字母或下劃線開頭,不能為關(guān)鍵字。
變量的類型。這個也不難理解,我們知道有整形(int,long),字符型(char),浮點型(float,double),指針型(*)當然還有數(shù)組結(jié)構(gòu)體等。相信這些我們再熟悉不過了。
存儲類別。這個是我們今天討論的重點。數(shù)據(jù)的存儲類別決定了一個數(shù)據(jù)的存在期和作用域,我們先了解一下存在期和作用域這兩個概念。
存在期:變量在內(nèi)存中保存的時間。其實簡單的說主要就兩種情況,一是隨函數(shù)的調(diào)用而起作用,隨函數(shù)的結(jié)束而結(jié)束。二是作用于整個程序期間,直到程序結(jié)束。
作用域:變量能夠有效作用的區(qū)域。這個簡單的說有三種情況,一是只能作用在一個代碼塊內(nèi)(或者說函數(shù)內(nèi)),二是作用于整個文件(或者說程序)中,三是除了所在的文件別的文件也可以使用。
那么說了半天我們的存儲類別是怎么決定存在期和作用域的呢。別急,就是通過下面幾個關(guān)鍵字和變量定義所在的位置這兩個條件的組合。
auto為存儲類說明符,可以說明一個變量為自動變量。省略存數(shù)類型時默認就是auto修飾。所修飾的全局變量在靜態(tài)區(qū),局部變量在棧中。
register聲明的變量屬于寄存器存儲類。所修飾的變量都在寄存器中保存。
static聲明的變量屬于靜態(tài)存儲類。所修飾的變量都在靜態(tài)區(qū)。
外部變量的函數(shù)中使用extern關(guān)鍵字來再次聲明。
我們把這幾個關(guān)鍵字和位置的組合總結(jié)一下相信會清楚很多:
組合 | 存儲期 | 作用域 | 初始值 |
auto +定義在函數(shù)內(nèi) | 和函數(shù)同步 | 函數(shù)內(nèi) | 不確定 |
auto +定義在函數(shù)外 | 和程序同步 | 本文件(程序)和外部文件 | 0 |
static+定義在函數(shù)內(nèi) | 和程序同步 | 函數(shù)內(nèi) | 0 |
static+定義在函數(shù)外 | 和程序同步 | 本文件(程序)內(nèi) | 0 |
register + 定義在函數(shù)內(nèi) | 和函數(shù)同步 | 函數(shù)內(nèi) | 不確定 |
說明一下,register只能修飾局部變量和形參,因為在寄存器內(nèi)所以沒有地址,也不可能是靜態(tài)的。
extern :外部引用,當需要外部引用時使用,就不做過多闡述了。
這里只是討論數(shù)據(jù)的存儲,對關(guān)鍵字的一些其他功能就不做過多的說明了,不知道看了以上的表格對大家理解數(shù)據(jù)的存儲期和作用域有沒有一些幫助。