C中變量的存儲類型及作用域

C語言變量的存儲類別

收集網上資料整理

   內存中供用戶使用的存儲空間分爲代碼區數據區兩個部分。變量存儲在數據區,數據區又可分爲靜態存儲區與動態存儲區。 

   靜態存儲是指在程序運行期間給變量分配固定存儲空間的方式。如全局變量存放在靜態存儲區中,程序運行時分配空間,程序運行完釋放。 

   動態存儲是指在程序運行時根據實際需要動態分配存儲空間的方式。如形式參數存放在動態存儲區中,在函數調用時分配空間,調用完成釋放。 

   對於靜態存儲方式的變量可在編譯時初始化,默認初值爲O或空字符。對動態存儲方式的變量如不賦初值,則它的值是一個不確定的值。 

  在C語言中,具體的存儲類別有自動(auto)、寄存器(register)、靜態(static)及外部(extern)四種。靜態存儲類別與外部存儲類別變量存放在靜態存儲區,自動存儲類別變量存放在動態存儲區,寄存器存儲類別直接送寄存器。 


一、auto變量

     函數中的局部變量,未加static,則自動爲auto變量。包括函數中的形參和在函數定義中的變量以及複合語句中定義的變量。這些變量在調用時自動爲它們分配存儲空間。調用完成後則釋放空間。

二、register變量

一般情況下,變量的值是存放在內存中的。當使用時,由控制器發出指令將內存中該變量的值送到運算器中。經過運算器進行運算。如果需要存數,再從運算器將數據送到內存存放。

如果一些變量使用頻繁,則可以將其存放在register中,而不必花費時間到內存中取數,存數,以節省時間。

注:只有局部自動變量和形參可以作爲寄存器變量;再者一個計算機系統中的寄存器數目是有限的。

、extern 外部變量(一個全局變量或者函數默認情況爲extern,因此無法在不同.c文件裏定義相同名稱的全局變量)

當一個變量在另一個文件中定義時,可以在該文件中聲明爲extern變量,從而可以訪問到另一個文件中定義的全局變量

file1 : int a;                //定義

file2 :extern int a;               //聲明

、static聲明的局部變量

用static聲明的局部變量。在函數調用結束後並不釋放存儲空間。在下一次調用時,其值爲上一次函數調用結束時的值。存儲於靜態存儲區,初始值爲0。雖然靜態變量的值在函數調用以後仍然存在,但其他函數並不能引用它(滿足局部變量的要求)。

、static聲明的全局變量

限制一個外部變量只被本文件引用,而不可以被其他的文件引用。

file1 : int a;

file2 :static int a;


用static聲明一個變量的作用有二

a、對局部變量用static聲明,則爲該變量分配的空間在整個程序執行期間始終存在。b、全局變量用static聲明,則該變量的作用域只限於本文件模塊



C語言變量的作用域

C程序的標識符作用域有三種:局部、全局、文件。標識符的作用域決定了程序中的哪些語句可以使用它,換句話說,就是標識符在程序其他部分的可見性。通常,標識符的作用域都是通過它在程序中的位置隱式說明的。


1.局部作用域

  局部作用域的變量,都是聲明在函數內部,無法被其他函數的代碼所訪問。函數的形式參數的作用域也是局部的,它們的作用範圍僅限於函數內部所用的語句塊。

像大括號{}中定義的變量也只有局部作用域;

2.全局作用域

  對於具有全局作用域的變量,我們可以在程序的任何位置訪問它們。當一個變量是在所有函數的外部聲明,也就是在程序的開頭聲明,那麼這個變量就是全局變量。全局作用域的變量可以跨文件訪問,只需要用extern聲明一下,指出在該文件的外部已經定義了這個變量即可。在大的工程裏,extern聲明一般放在.c文件對應的頭文件.h裏,#include這個頭文件就可以了。

3.文件作用域

  在很多C語言書上,都沒有說明文件作用域,或者只是略微的提到,其實文件作用域在較大程序中很有作用(在多文件系統中)。文件作用域是指外部標識符僅在聲 明它的同一個轉換單元內的函數彙總可見。所謂轉換單元是指定義這些變量和函數的源代碼文件(包括任何通過#i nclude指令包含的源代碼文件)static存儲類型修飾符指定了變量具有文件作用域。也就是說無法像全局作用域變量那樣通過extern來訪問了。





發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章