重學c語言系列二 (變數)

2021-06-20 23:25:28 字數 2658 閱讀 7205

在c語言中,對變數的儲存型別說明有以下四種:

auto     自動變數

register    暫存器變數

extern    外部變數

static    靜態變數

自動變數和暫存器變數屬於動態儲存方式,外部變數和靜態變數屬於靜態儲存方式。

按作用域又可分為全域性變數和區域性變數

c語言規定, 函式內凡未加儲存型別說明的變數均視為自動變數, 也就是說自動變數可省去說明符auto

作用域和生存期都侷限於定義它的個體內( 函式或復合語句內),我當初理解就是最內層包含它的花括號內。

需要注意的是,變數從宣告開始就是可見的了。

舉例:

#includeint i=1;

int main()

這段程式的輸出其實並不是1,而是不確定的,i從宣告開始就可見了,在作用域了,它遮蓋了全域性變數。

上述各類變數都存放在儲存器內, 因此當對乙個變數頻繁讀寫時,必須要反覆訪問記憶體儲器,從而花費大量的訪問時間。 為此,c語言提供了另一種變數,即暫存器變數。

這種變數存放在cpu的暫存器中,使用時,不需要訪問記憶體,而直接從暫存器中讀寫, 這樣可提高效率。暫存器變數的說明符是register。

對於迴圈次數較多的迴圈控制變數及迴圈體內反覆使用的變數均可定義為暫存器變數。

求∑200i=1imain()

本程式迴圈200次,i和s都將頻繁使用,因此可定義為暫存器變數。對暫存器變數還要說明以下幾點:

1. 只有區域性自動變數和形式引數才可以定義為暫存器變數。因為暫存器變數屬於動態儲存方式。凡需要採用靜態儲存方式的量不能定義為暫存器變數。

2. 在turbo c,ms c等微機上使用的c語言中, 實際上是把暫存器變數當成自動變數處理的。因此速度並不能提高。

而在程式中允許使用暫存器變數只是為了與標準c保持一致。

ps:按照《c專家程式設計》書中的觀點,這樣設計是不合理,應該是由編譯器處理變數儲存的分配工作,這樣肯定會比人為死板設定更靈活,實際執行更有效率

雖然這樣減輕了編譯器的負擔,而只是吧工作交給了程式設計師。

全域性變數也稱為外部變數,它是在函式外部定義的變數。 它不屬於哪乙個函式,它屬於乙個源程式檔案。

其作用域是整個源程式(嚴謹一點是在使用位子說明後產生作用)。在函式中使用全域性變數,一般應作全域性變數說明。

否則作用域應該是從宣告處到整個源程式結束

舉例:

#includeint main()

int i=1;

如果沒有extern說明,是編譯不了的,即未說明前全域性變數作用不了那裡。

只有在函式內經過說明的全域性變數才能使用。全域性變數的說明符為extern。

即在乙個函式之前定義的全域性變數,在該函式內使用可不再加以說明。

外部變數的幾個特點:

1. 外部變數和全域性變數是對同一類變數的兩種不同角度的提法。全域性變數是從它的作用域提出的,外部變數從它的儲存方式提出的,表示了它的生存期。

2. 當乙個源程式由若干個原始檔組成時, 在乙個原始檔中定義的外部變數在其它的原始檔中也有效。例如有乙個源程式由原始檔source1.c和source2.c組成:

source1.c

int a,b; /*外部變數定義*/

char c; /*外部變數定義*/

main()

source2.c

extern  a,b; /*外部變數說明*/

extern  c; /*外部變數說明,只需要標示符就行了,不再需要型別宣告*/

func (int x,y)

在source1.c和source2.c兩個檔案中都要使用a,b,c三個變數。在source1.c檔案中把a,b,c都定義為外部變數。在source2.c檔案中用extern把三個變數說明為外部變數,

表示這些變數已在其它檔案中定義,並把這些變數的型別和變數名,編譯系統不再為它們分配記憶體空間。

ps: gcc source1.c source2.c -o a.out

靜態變數又分為靜態全域性變數和靜態區域性變數。

靜態區域性變數屬於靜態儲存方式,它具有以下特點:

(1)靜態區域性變數在函式內定義,但不象自動變數那樣,當呼叫時就存在,退出函式時就消失。靜態區域性變數始終存在著,也就是說它的生存期為整個源程式。

(2)靜態區域性變數的生存期雖然為整個源程式,但是其作用域仍與自動變數相同,即只能在定義該變數的函式內使用該變數。退出該函式後,

儘管該變數還繼續存在,但不能使用它。

對基本型別的靜態區域性變數若在說明時未賦以初值,則系統自動賦予0值。而對自動變數不賦初值,則其值是不定的。

全域性變數(外部變數)的說明之前再冠以static 就構成了靜態的全域性變數。全域性變數本身就是靜態儲存方式, 靜態全域性變數當然也是靜態儲存方式。

這兩者在儲存方式上並無不同。這兩者的區別雖在於非靜態全域性變數的作用域是整個源程式, 當乙個源程式由多個原始檔組成時,

非靜態的全域性變數在各個原始檔中都是有效的。 而靜態全域性變數則限制了其作用域, 即只在定義該變數的原始檔內有效,

在同一源程式的其它原始檔中不能使用它。由於靜態全域性變數的作用域侷限於乙個原始檔內,只能為該原始檔內的函式公用,

因此可以避免在其它原始檔中引起錯誤。從以上分析可以看出, 把區域性變數改變為靜態變數後是改變了它的儲存方式即改變了它的生存期。

把全域性變數改變為靜態變數後是改變了它的作用域, 限制了它的使用範圍。因此static 這個說明符在不同的地方所起的作用是不同的。

C語言(二)變數

學習c語言,就不得不說一下資料。首先,要知道資料的型別和他們的大小,就我個人的理解,所謂型別就是對各種資料按用途進行劃分,便於程式設計師對他們進行使用和理解。cpu都是在記憶體中對資料進行操作,由於記憶體的儲存空間不大,所以為了節省空間,對不同型別的資料進行不同大小的劃分。如 char short ...

C 學習系列之二 變數

1.什麼叫變數 變數是指在程式的執行過程中隨時可以發生變化的量。要使用變數,需要申明他們,所謂申明就是給變數指定型別和名稱。變數申明後就可以用它們做儲存單元,存放申明的資料型別的資料。變數名定義規則 變數名必須由字母 數字 下劃線組成不能與c 中關鍵字相同 格式 型別 變數名 例 string us...

go語言(二)變數

一 定義賦值 定義乙個int的 var myvar int 定義多個 var myvar,myvar1,myvar2 int 定義並賦予初始值 var myvar int 1 定義多個並賦予初始值 var myvar,myvar1,myvar2 int 1,2,3 麻煩是吧。其實可以簡單 var m...