摘 要: 在所有的計算機高級語言中,都存在著變量這樣一個重要的概念。變量是計算機高級語言程序的重要成分之一。與其他語言中的變量相比,C語言中的變量所包含的內容更為豐富,包括變量的定義、數據類型、變量數據類型的轉換、作用域、存儲類別和存儲方式等。
關鍵詞: C語言 變量 變量的存儲類別
C語言是一種應用廣泛的、結構化的程序設計語言。程序設計的一項主要任務就是對數據進行處理,編寫程序時需要用到各種變量來存放數據。因此,變量在C語言中是一個很重要的概念。由于C語言的數據結構豐富,變量的內容也很多,包括變量的概念、定義、數據類型、作用域、存儲類別和存儲方式等。靈活掌握C語言中的各種變量,對程序設計將起到至關重要的作用。
一、變量的概念
變量是內存或寄存器中用一個標識符命名的存儲單元,可以用來存儲一個特定類型的數據,并且數據的值在程序運行過程中可以進行修改??梢?,變量首先是一個標識符或者名稱,就像一個客房的編號一樣,有了這個編號,我們就可以找到房間的客人。為了方便,我們在給變量命名時,最好能符合大多數人的習慣,應見名知義,便于交流和維護。
二、變量的定義和初始化
在C語言中要使用變量必須先定義,再使用。一個變量定義的完整格式是(里的部分表示可以省略的部分):
[存儲類型]數據類型 變量名1[=表達式1],變量名2[=表達式2],……,變量名n[=表達式n]。
定義一個變量的過程就是向內存申請一個符合該數據類型的內存空間,以后對該變量的操作就是對對應內存空間的存取操作。
在這個定義中,存儲類型決定了變量存放在何處,數據類型決定了這個變量所占的字節數,變量名決定了這個變量在本程序中的名字,表達式則決定了這個變量的初始值,使用變量之前應該給一個值,編譯程序將幫助我們發現那些還沒有被給定一個值就被使用的變量。不過,變量不一定需要初始化。在函數外部定義的變量或者在函數內部用static關鍵字定義的變量在沒有明確地被初始化之前都已被系統初始化為0了。在函數內部或程序塊內部定義的不帶Static關鍵字的變量都是自動變量,如果沒有明確地對這些變量進行初始化,它們就是會具有未定義值。如果沒有對一個自動變量進行初始化,在使用它之前就必須保證先給它賦值。
三、變量的數據類型
程序設計最基本的問題是解決對所要處理數據的描述。任何一個數據,都有一個確定的表示形式。一個確定的值和確定的能參與的各種運算,就是數據類型。程序中變量的本質表現在存在時間和占用空間這兩個方面。變量的數據類型決定了變量占用的存儲空間。它受類型說明語句的制約。任一變量都必須具有確定的數據類型。不管變量怎樣變化,其值都必須符合該類數據類型的規定。
四、變量的存儲類型
C語言中變量不僅僅有數據類型,還有存儲類型。數據類型用來說明變量所占的存儲空間的大小和可以進行的操作,存儲類型用來表示變量的生命期和作用域,即變量起作用的范圍。在C語言中,按照變量的作用域把變量分為兩種:局部變量和全局變量。
1.局部變量
在一個函數內部定義的變量,只在本函數內部有效,這種變量稱為“局部變量”。例如:主函數與被調用函數中可以有相同的變量名,但這些變量只作用在它自己的范圍內,即兩個函數中的同名變量,在內存中占有不同的存儲單元,是兩個不同的變量。局部變量存在于以下幾種形式中:
(1)在一個函數內部定義的變量是局部變量,只能在函數內部使用。
(2)在主函數內部定義的變量也是局部變量,其它函數也不能使用主函數中的變量。
(3)形式參數是局部變量。
(4)在復合語句中定義的變量是局部于復合語句的變量,只能在復合語句中使用。
(5)局部變量在函數被調用的過程中占有存儲單元。
(6)不同函數中可以使用同名變量。在不同的作用域內,可以對變量重新進行定義。
2.全局變量
在函數外部定義的變量是全局變量,其作用域是變量定義位置至整個程序文件結束。使用全局變量,可增加函數間數據聯系的渠道。全局變量可以將數據帶入到作用域范圍內的函數,也可以將數據帶回到作用域范圍內的其它函數。提前引用外部變量,需對外部變量進行說明,或稱聲明。局部變量如與外部變量同名,則在局部變量的作用域內,外部變量存在,但不可見,外部變量的作用被屏蔽。全局變量在程序運行過程中均占用存儲單元。在編程時,原則上盡量少用全局變量,能用局部變量,不用全局變量,要避免局部變量全局化。
在C語言中,按照變量在內存中存在的時間(生存期)角度來分,可分為動態存儲方式和靜態存儲方式。
(1)靜態存儲變量
凡是用關鍵字Static定義的變量全部被稱為靜態變量。所有的靜態變量全部存儲在靜態存儲區,在程序的運行期間一直存在。
(2)動態存儲變量
動態存儲變量是存儲在動態存儲區的,這種變量只在定義它們的時候才創建,在定義它們的函數返回時系統回收變量所占內存。對這些變量的創建和回收是由系統自動完成的,所以也叫自動變量(用關鍵字Auto定義)。最典型的例子就是函數中定義的局部變量。
變量的特性除了數據類型之外,還有存儲類別。C語言中變量的存儲類別有四種:自動型(Auto)、靜態型(Static)、外部型(Extern)、寄存器型(Register)。
①自動型(Auto)
Auto表示自動變量,通常關鍵字Auto可以省略,自動變量必須定義在函數內部,我們以前所說的變量基本上都是這種類型,函數的形式參數也是這種類型。自動型變量是局部變量,所以作用域是本函數。若是在復合語句中說明的自動變量,其作用域是本復合語句。
②靜態型(Static)
在函數內部以Static進行說明的變量。它是局部變量,作用域與自動變量相同。它的存儲方式是靜態的,當它被說明后就占有存儲單元,直到本程序執行結束,所以它的生命期是從被說明開始到程序執行結束。當一個變量被定義為靜態型時,如果它沒有賦值,系統自動賦0值,而自動變量不賦值,它的值是不確定的。
③外部型(Extern)
在函數外部說明的變量,它是全局變量,所以作用域是從說明開始到程序結束。它的存儲方式是靜態型,所以它的生存期是從說明開始到整個程序執行結束。外部變量有定義性說明和引用性說明兩種形式,定義性說明作用是定義一個外部變量,不需要使用Extern。若外部變量在程序的后面說明,當前不能直接使用,若要使用就必需使用Extern進行引用性說明。
④寄存器型(Register)
Register關鍵字用于聲明寄存器變量,頻繁使用的變量聲明為Register型可以提高程序效率,也可以交給編譯器自行優化(編譯器一般把循環控制變量存儲類型定為Register),Register類型的變量受處理器寄存器長度的限制,不符合要求的Register變量將會被處理成Auto型內存變量。Register變量在作用時駐留于處理器的寄存器,故其作用域也只限于相應的函數和復合語句,和Auto類似。
總之,C語言中的變量類型豐富,運用靈活。只有多想、多練、多編寫程序,我們才能真正掌握其中的含義。
參考文獻:
[1]譚浩強.C程序設計.北京:清華大學出版社,2002.8.
[2]王煜等.C語言程序設計.中國鐵道出版社,2005.2.