C/C++變量的分類,static的用法

在C/C++中,常常有全局變量,局部變量,臨時變量,靜態變量等等說法。同時也有static修飾符的不同用法。這往往會對初學編程的人帶來困擾。其實在這些說法當中,有些概念雖然叫法不同,但意思卻有相互的包含關係。而有一些概念,又暗含了另一些變量屬性。

這裏,我將從“生存期”和“作用域”兩個維度對變量進行分類。如下:

按作用域分:全局變量 VS 局部變量
按生存期分:靜態變量 VS 自動變量

全局變量也稱爲外部變量,它是在函數外部定義的變量。 它不屬於哪一個函數,它屬於一個源程序文件。其作用域是整個源程序。【引自百度】。而局部變量,則是相對“全局變量”而言的,定義在函數內部的變量。其中“全局變量”是放在靜態存儲區的,是“靜態變量”,因此常有“靜態全局變量”的說法。儘管局部變量和自動變量所屬分類不同,但往往“局部變量”就是“自動變量”, “自動變量”就是“局部變量”。


似乎本文到此就可以結束了。但事實上,故事還沒完。在C/C++中,我們還可以通過“存儲類型”修飾符(如static)改變變量的“生存期”。也就是說,局部變量也能是一個靜態變量。這個時候,“局部靜態變量”就不能再被稱爲“自動變量”了

此外,全局變量的“全局”二字,往往只是在“當前文件”內全局可見,其定義並沒有規定是否能被同一個工程的其他源文件訪問(當然,在其他源文件中需要用extern聲明纔可以)。


問題的關鍵,就在於static修飾符的不同語義。

當它修飾的是一個局部變量的時候,它的意思是改變這個局部變量的存儲類別,亦即改變其【生存期】。

當它修飾的是一個全局變量的時候,它的意思是改變這個變量的【作用域】——即限制其作用域爲本文件內,在其他源文件內不可見。


上述關於關於變量的分類的圖示關係如下:



下面是具體的代碼分析分析。

static int a1 = 10;
int a2 = 20;
func()
{
    static int b = 30;
    int c = 40;
}

在上述代碼中,a1、a2都是全局變量,而且也都是靜態變量。程序運行時都存儲在“靜態存儲區”內。但a1、a2不同的地方在於,a1只能能夠在本源文件內使用,a2則可以被本文件之外的其他源文件引用(需要配合使用extern聲明變量)。
b、c都是局部變量,也都只能在func函數內使用。他們的不同在於,每次調用func函數時,c都將重新初始化,其對應的內存每次都可能不一樣。而b則只會在第一次調用func函數時初始化,且每次調用的時候b對應的都是相同的內存空間——它也是存儲在“靜態存儲區”的。






發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章