C語言之局部變量&全局變量&變量存儲方式


備注:1、文章中的例子暫時為空,日后希望自己能自己編寫例子賦貼上來。

一、角度分析:

     變量作用域 -------> 局部變量和全局變量

     變量存在的生存期 ---------> 靜態存儲方式和動態存儲方式

二、局部變量:

      局部變量也稱為內部變量。局部變量是在函數內作定義說明的。其作用域僅限於函數內,離開函數后再使用這種變量是非法的。

例子:

 

關於局部變量的作用域還要說明以下幾點:

1)主函數也是一個函數,它與其他函數是平行關系。主函數中定義的變量也只能在主函數中使用,不能在其他函數中使用。同時,主函數中也不能使用其他函數中定義的變量。

2)形參變量是屬於被調函數的局部變量,實參變量是屬於主調函數的局部變量。

3)在不同函數中可以使用相同的變量名,它們代表不同的對象,編譯器分配不同的單元,互不干擾。

4)在復合語句中定義的變量其作用域只能在復合語句范圍內。

例子:

 

三、全局變量

     全局變量也稱為外部變量,是在函數外語定義的變量。它不屬於哪一個函數,它屬於一個源程序文件(所以只要是在同一個源程序文件,那么就可以利用這個變量進行賦值或其他操作)。其作用域是整個源程序(如何理解這里的“源程序”)。在函數中使用全局變量,一般應作全局變量說明。只有在函數內經過說明的全局變量才能使用。全局變量的說明附為:extern。但在一個函數之前定義的全局變量,在該函數內使用可不再加以說明。

例如:

 

 

三、變量的存儲方式

     用戶存儲空間可以分為三個部分:

程序區
靜態存儲區(在程序運行期間分配固定的存取空間的方式。

動態存儲區(在程序運行期間根據需要進行動態的分配存儲空間的方式。

 

      動態存儲區存放一下數據:

        1)函數形式參數;

        2)自動變量(未加static聲明的局部變量);

        3)函數調用實的現場保護和返回地址;

        對以上這些數據,在函數開始調用時分配動態存續空間,函數結束時釋放這些空間。

        在c語言中,每個變量和函數有兩個屬性:數據類型和數據存儲類別。

      1、auto變量:

        函數中的局部變量,如不專門聲明為 static 存儲類別,都是動態地分配存儲空間的,數
據存儲在動態存儲區中。函數中的形參和在函數中定義的變量(包括在復合語句中定義的變
量),都屬此類,在調用該函數時系統會給它們分配存儲空間,在函數調用結束時就自動釋
放這些存儲空間。這類局部變量稱為自動變量。自動變量用關鍵字 auto 作存儲類別的聲明。
例如:
int f(int a) /*定義 f 函數,a 為參數*/
{auto int b,c=3; /*定義 b,c 自動變量*/
……
}
a 是形參,b,c 是自動變量,對 c 賦初值 3。執行完 f 函數后,自動釋放 a,b,c 所占
的存儲單元。
關鍵字 auto 可以省略,auto 不寫則隱含定為“自動存儲類別”,屬於動態存儲方式。

2、用static聲明局部變量

     有時希望函數中的局部變量的值在函數調用結束后不消失而保留原值,這時就應該指定局部變量為“靜態局部變量”,用關鍵字static進行聲明。

例如:

f(int a)

{

  auto b=0;

  static c=3;

      b=b+1;

      c=c+1;

      return(a+b+c);

}

main()

{

  int a=2, i;

     for(i=0;i<3;i++)

  printf("%d",f(a));

對靜態局部變量的說明:

1)靜態局部變量數據靜態存儲類別,在靜態存儲區分配存儲單元。在程序整個運行期間都不釋放。而自動變量(即動態局部變量)屬於動態存儲類別,占動態存儲空間,函數調用結束后即釋放。

2)靜態局部變量在編譯時賦初始值,即只賦初始值一次;而對自動變量賦初始值是在函數調用進行,沒調用一次函數重新給一次初值,相當於執行一次賦值語句。

3)如果在定義局部變量時不賦初始值的話,則對靜態局部變量來說,編譯時自動賦初值0(對數值型變量)或空字符(對字符變量)。而對自動變量來說,如果不賦初值則它的值是一個不確定值。

例如:

 

3、用extern聲明外部變量

     外部變量(即全局變量)是在函數的外部定義的,它的作用域為從變量定義處開始,到本程序文件的末尾。如果外部變量不在文件的開頭定義,其有效的作用范圍只限與定義處到文件終了。如果在定義點之前的函數想引用該外部變量,則應該在引用之前用關鍵字extern對該變量做“外部變量聲明”。表示該變量是一個已經定義的外部變量。有了此聲明,就可以從“聲明”處起,合法地使用該外部變量。

 

 

}

 

    

額外鏈接:

1、全局變量與局部變量在內存中的區別詳細解析  http://www.jb51.net/article/42012.htm

-----------------

Hayder

E:hayder-su@qq.com

2015-4-26

 

 

     

 


免責聲明!

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



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