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