c語言局部變量、全局變量、靜態變量、內部函數、外部函數、聲明、定義、extern作用總結


一、先搞一波概念

變量按作用域分:

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)所謂變量的聲明,只是把作用域擴張到聲明處以下,僅僅而已,而且只有這一種聲明方法。

 

這篇文章只總結變量的聲明和定義吧,函數的放到這里總結吧,這樣顯得沒那么亂!

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM