一、先搞一波概念
變量按作用域分:
1.局部變量:
(1)在函數的開頭定義(如定義形參)。
(2)在函數內部定義(如在函數里面定義的變量)。
(3)在函數內部的復合語句定義(如for循環,花括號內)。
前兩種方式定義的變量可以在函數內任何地方使用,而第三種方式定義的變量只能在復合語句內使用。
說明:
(1)不同函數\同一函數不同復合語句,可以使用同名變量,它們表示不同對象,互不干擾。
2.全局變量
在函數之外定義的變量稱為全局變量,也稱為外部變量,其作用域為從定義變量的位置開始到本源文件結束。
說明:
(1)因為函數只能返回一個返回值,因此可以通過使用全局變量來實現一個函數改變多個值后,還能被其他函數調用。
(2)全局變量在程序執行整個過程中都占用存儲單元,使用太多全局變量所以占用空間比較大。
(3)局部變量會屏蔽同名的全局變量,即局部變量優先。
按變量的存儲方式來分:
3.動態存儲方式
程序運行期間根據需要進行動態分配存儲空間方式。
說明:
(1)函數結束時自動釋放存儲空間。
(2)同一個動態變量被執行兩次,其存儲空間的地址不一定相同,因為其第一次調用完后會釋放地址,第二次調用不一定還是分配第一次調用的地址,所以導致動態變量在定義時不初始化,
其值為隨機數(不能確保分配的地址上存了什么數)。
4.靜態存儲方式
程序運行期間由系統分配固定的存儲空間的方式。
說明:
(1)在程序執行整個過程中都占用存儲單元,如果靜態變量在定義時不初始化,其值都為0或“\0”。
5.變量存儲類別
在c語言中,每一個變量和函數都是有兩個屬性:數據類型和數據的存儲類別。c語言中分為四種類別:自動的(auto)、靜態的(static)、寄存器的(register)、外部的(extern),自動變量存放在動態存儲區,靜態變量和外部變量存放在靜態存儲區中,寄存器變量存放在CPU的寄存器中。如果在定義或者聲明時沒有指定,系統會采取默認方式。
重點來了:
1.局部變量與存儲類別的關系
(1)自動變量(格式:auto 變量):
在局部變量中,只要不指定其為靜態存儲類別(static),都是以動態分配存儲空間,所以當定義一個自動變量時,可以省略(auto),如形參等,在程序中推薦使用,也是使用最多的一個變量
(2)靜態局部變量(格式:static):
使用關鍵字static來定義,在函數調用完不釋放空間,在下次調用時,還保留上一次的值。一般使用它比較有技巧,比如計算n!,可以循環調用一個函數實現累乘,把結果存放在一個靜態局部變量中(這個變量可以在被調函數中,這可以放在主調函數中,當然還可以把它換成全局變量,效果都一樣)。
說明:
(1)靜態局部變量只在編譯時賦值,即只在編譯時執行“static int a = 1 ” 這句代碼一次,無論運行期間調用這句代碼所在的函數多少次,前提是必須在定義的同時賦值;而自動局部變量,沒調用一次就執行定義賦值一次。
如下代碼:


(2)使用靜態存儲要多占內存,降低程序可讀性,不要過多使用。
(3)局部變量無聲明(extern)
2.全局變量與存儲類別的關系
(1)所有全局變量都是靜態變量,都存在靜態存儲區。
(2)所有外部變量不加static修飾,都可以使用關鍵字extern來聲明(格式為 extern(int可省略類型) a;),可以擴張其作用域從聲明處開始,還可以跨源文件聲明使用。
(3)在外部變量前面加static修飾符,可將外部變量限制在本文件中。這里有一個坑,如果變量為static全局變量,在函數內不能擴張其作用域,必須在函數外聲明以達擴張效果(包括主函數)。
(4)外部變量和局部變量都只能定義一次,但外部變量可以聲明多次,而局部變量不能有聲明。
(5)所謂變量的聲明,只是把作用域擴張到聲明處以下,僅僅而已,而且只有這一種聲明方法。
這篇文章只總結變量的聲明和定義吧,函數的放到這里總結吧,這樣顯得沒那么亂!
