天天看點

static在c語言中的作用_C語言函數中的變量

局部變量和全局變量

C語言中變量按其作用域分,可分為局部變量和全局變量,具體的解釋為:

局部變量(内部變量):在定義它的函數内有效,但是函數傳回後失效;

全局變量(外部變量):在所有源檔案内均有效。在同源檔案的函數中使用使用全局變量,需要将全局變量提前聲明;同時在不包含全局變量定義的不同源檔案需要用extern關鍵字再次聲明。

關于C語言全局變量和局部變量,還有幾個注意點:

如果在該函數内定義了一個與之前定義的全局變量同名的變量,那麼該同名局部變量就會在函數内部屏蔽全局變量的影響。即當局部變量與全局變量同名時,在局部變量的作用範圍之内,全局變量不起作用。局部變量優先原則;

全局變量是有預設值的(引用類型的變量預設值都是null,基本類型的變量預設值則不一樣,int型變量預設值是0),但是局部變量沒有預設值;

全局變量可以在函數外定義并初始化,但不能進行指派操作。這是什麼意思呢?我們看一下:

static在c語言中的作用_C語言函數中的變量

此時程式運作通過,程式中a為全局變量,在函數外進行定義并初始化。

static在c語言中的作用_C語言函數中的變量

此時程式運作錯誤。全局變量在函數體外隻能進行初始化,不能進行指派運算。

static在c語言中的作用_C語言函數中的變量

此時程式運作通過,C語言執行過程中,對代碼進行了優化,把程式2中的int a;a=1;優化為一句話:int a=1;這就是初始化。

變量的存儲類型

C語言中變量按其存在的時間(即生存期)分,可分為動态存儲變量和靜态存儲變量。

動态存儲變量:當程式運作進入定義它的函數或複合語句時才被配置設定存儲空間,程式運作結束離開此函數或複合語句時,所占用的記憶體空間被釋放。這是一種節省記憶體空間的存儲方式;

靜态存儲變量:在程式運作的整個過程中,始終占用固定的記憶體空間,直到程式運作結束,才釋放占用的記憶體空間。靜态存儲類别的變量被存放在空間的靜态存儲區。

在C語言程式運作時,占用的記憶體空間被分成三部分:程式代碼區、靜态存儲區、動态存儲區。

程式運作中的資料分别存儲在靜态存儲區和動态存儲區。靜态存儲區用來存放程式運作期間所占用的固定存儲單元的變量,如全局變量等;動态存儲區用來存放不需要長期占用記憶體的變量,如局部變量等。

變量的存儲類型具體來說分成4種:自動類型(auto)、寄存器類型(register)、靜态類型(static)、外部類型(extern)。其中,自動類型、寄存器類型的變量屬于動态變量,靜态類型、外部類型屬于靜态變量。

自動變量(auto)

自動類型是C語言程式中使用最廣泛的一種類型。函數中的局部變量,如果不專門聲明為static存儲類型,都是動态配置設定存儲空間的,資料存儲在動态存儲區。函數中的形參和函數中定義的變量都屬于此類。在調用這些函數時,系統會給它們配置設定存儲空間,在函數調用結束後就自動釋放這些存儲空間。

C語言規定:函數内凡未加存儲類型說明的變量均視為自動變量,也就是說,自動變量可省略說明符auto,說明符auto不寫則隐含表示該變量為自動存儲類型的。

對于自動變量來說,如果不賦初值,它的值是一個不确定的值。

自動變量的一般形式為:

{

(auto) 類型 變量名;

}

靜态變量(static)

靜态變量存儲在靜态存儲區,用static關鍵字來聲明。屬于靜态存儲方式,又可分成靜态全局變量和靜态局部變量。

C語言規定:靜态變量(包括靜态局部變量、靜态全局變量)有預設值,int型等于0,float型等于0.0,char型等于'0'。而自動變量和寄存器變量沒有預設值,是随機值。

靜态局部變量:隻在定義它的函數内有效。隻是程式僅配置設定一次記憶體,函數傳回後,該變量不會消失,隻有程式結束後才會釋放記憶體;

靜态全局變量:隻在定義它的檔案内有效,且生存期在整個程式運作期間。

靜态變量的一般形式為:

static 類型 變量名;

{

static 類型 變量名;

}

static在c語言中的作用_C語言函數中的變量

static關鍵字的作用:

在函數體中,一個被聲明為靜态的變量在這一函數被調用過程中隻會被配置設定一次記憶體,且整個運作期間不會重新配置設定;

在函數體外、某個源檔案内,一個被聲明為靜态的變量隻可被該源檔案内的所有函數通路,但不能被其他源檔案的函數通路。它是一個本地的全局變量;

在某個源檔案内,一個被聲明為靜态的函數僅僅隻可以被這個源檔案的其它函數調用。也就是說,這個函數被限制在聲明它的源檔案的本地範圍之内使用。

也就是說,static的作用主要展現在兩點上:

對于局部變量而言,加上static,就将資料儲存到靜态存儲區,僅配置設定一次記憶體,生存期大大加強(改變存儲區域);

對于全局變量而言,由于本身已經在靜态存儲區,加上static,就将變量作用域限制到定義它的源檔案内(改變作用域)。

對于函數也是一樣,限制範圍。而不限制全局變量和函數範圍的時候,其他源檔案需要引用的時候,都需要extern關鍵字。

寄存器變量(register)

除了常用的自動變量和靜态變量之外,C語言還提供了一種幫助程式員利用CPU寄存器的方法。使用關鍵字register來聲明局部變量時,該變量即稱為寄存器變量。寄存器變量是動态局部變量,存放在CPU的寄存器或動态存儲區中,該類變量的作用域、生存期和自動變量相同。如果沒有存放在寄存器中,就按自動變量處理。

寄存器變量的好處是:寄存器的存儲速度比記憶體快得多。但是由于現在編譯系統的優化,使得編譯器可以自動識别頻繁使用的變量,并自動将其存儲在寄存器中,故而現在寄存器變量的定義是不必要的。

寄存器變量的一般形式為:

{

register 類型 變量名;

}

register由于是在寄存器(動态存儲區)中,是以,寄存器變量不可能同時又是全局變量或者靜态變量!

外部變量(extern)

外部變量(即全局變量)是在函數的外部定義的,它的作用域為從變量定義處開始,到本程式檔案的末尾。如果在定義點之前的函數想引用該外部變量,則應該在引用之前用關鍵字extern對該變量作“外部變量聲明”。表示該變量是一個已經定義的外部變量。有了此聲明,就可以從“聲明”處起,合法地使用該外部變量。

在一個檔案中定義的全局變量預設為外部的,即關鍵字extern可以省略,但如果在其他的檔案中使用這個檔案定義的全局變量,則必須在使用前用extern進行外部聲明。

外部變量的一般形式為:

extern 類型 變量名;

extern關鍵字的作用:

在本檔案範圍内擴充外部變量的作用域;

将外部變量作用域擴充到其他源檔案中。

最後,如果你想學C/C++可以私信小編“01”擷取素材資料以及開發工具和聽課權限哦!

繼續閱讀