c語言中變量分爲四類,分別是app
1.auto 自動變量函數
2.static 靜態存貯分配變量(又分爲內部靜態和外部靜態)oop
3.extern 全程變量(用於外部變量說明)spa
4.register 寄存器變量(分配在硬件寄存器中).net
四大類,全部變量必須先說明(定義),後使用。指針
下面分別介紹blog
1.自動變量(局部變量)生命週期
局部變量:在一個函數開頭或段開頭處說明的變量,ip
它有幾個特徵,,
a、做用域爲定義它的函數作用域
b、編譯器不會對自動變量給予隱含的初值,故其值不肯定,所以每次使用前必須明確的置初值。
c、形參是自動變量,做用域僅限於相應函數內
d、自動變量隨函數的引用而存在和消失,由一次調用到下一次調用之間不保持值。
2.外部變量:在函數外部定義的變量即爲外部變量,它的做用域是整個程序(全程變量)。
a. c程序能夠分別放在幾個文件上,每一個文件能夠做爲一個編譯單位分別進行編譯。外部變量只需在某個文件上定義一次,其它文件若要引用此變量時,應用extern加以說明(外部變量定義時沒必要加extern關鍵字)。
b. 在同一文件中,若前面的函數要引用後面定義的外部(在函數以外)變量時,在函數里加extern加以說明。
引進外部變量的緣由:解決函數單獨編譯的協調;與變量初始化有關;外部變量的值是永久的;解決數據共享;
注意:函數自己也被認爲是外部變量
3.靜態變量:分爲內部靜態變量和外部靜態變量
內部靜態變量:a.在局部變量前加上static就爲內部靜態變量
b.靜態局部變量還是局部變量,其做用域仍在定義它的函數範圍內,但它採用靜態存貯分配(由編譯程序在編譯時分配,而通常的自動變量和函數形參均採用動態存貯分配,即在運行時分配空間),當函數執行完,返回調用點時,該變量並不撤銷,再次調用時,其值將繼續存在。
外部靜態變量:a.在函數外部定義的變量前加static即爲外部靜態變量
b.做用域爲定義它的文件,即成爲該文件的私有變量,其餘文件上的函數一概不得直接訪問,除非經過它所在文件上的函數進行操做,這可實現數據隱 藏。
4.寄存器變量:只有自動(局部)變量和函數參數才能進一步指定爲寄存器存貯類
a.使用register變量能夠提升存取速度,但寄存器變量的數目依賴於具體機器,聲明多了也只有前幾個有效。
b.只限於int,char,short ,unsigned和指針類型用寄存類。
c.不能對register變量取地址(即&操做)
變量的初始化:
外部變量和靜態變量由編譯程序給予隱含的初始值0;
局部變量的初始化每進入函數便初始化一次。
外部或靜態變量僅在編譯時初始化一次。
自動變量或寄存器變量只能顯示初始化,不然將有不肯定的值。
外部數據的說明,若是帶有初始化項,則當成一個定義。
int i = 0;
main( )
{
int i = 1;
printf(「i=%d, 」, i);
{
int i = 2;
printf(「i=%d, 」, i);
{
i += 1;
}printf(「i=%d, 」, i);
printf(「i=%d, 」, i);
}
printf(「i=%d\n 」, i);
}
結果:i=1, i=2, i=3, i=3, i=1