天天看點

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

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

這裡,我将從“生存期”和“作用域”兩個次元對變量進行分類。如下:

按作用域分:全局變量 VS 局部變量

按生存期分:靜态變量 VS 自動變量

全局變量也稱為外部變量,它是在函數外部定義的變量。 它不屬于哪一個函數,它屬于一個源程式檔案。其作用域是整個源程式。【引自百度】。而局部變量,則是相對“全局變量”而言的,定義在函數内部的變量。其中“全局變量”是放在靜态存儲區的,是“靜态變量”,是以常有“靜态全局變量”的說法。盡管局部變量和自動變量所屬分類不同,但往往“局部變量”就是“自動變量”, “自動變量”就是“局部變量”。

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

此外,全局變量的“全局”二字,往往隻是在“目前檔案”内全局可見,其定義并沒有規定是否能被同一個工程的其他源檔案通路(當然,在其他源檔案中需要用extern聲明才可以)。

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

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

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

上述關于關于變量的分類的圖示關系如下:

C/C++變量的分類,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對應的都是相同的記憶體空間——它也是存儲在“靜态存儲區”的。