c語言基礎必備 變數生存區與作用域

2021-06-19 09:30:42 字數 2343 閱讀 1211

一、生存區

不少人對於生存期有著一種錯誤的理解,認為變數離開了它的作用域,其生存期就結束了。產生這種誤解的原因,是對於生存期的概念理解不深刻。所謂的生存期,其實是指變數占用記憶體或者暫存器的時長。根據變數儲存類別的不同,在編譯的時候,變數將被存放到動態儲存區或靜態儲存區中,所以其生存期是由宣告時的儲存類別所決定的。

(1)首先我們講一下靜態儲存區與動態儲存區

靜態儲存區:

存放全域性變數和靜態變數,在程式執行之前分配儲存空間,佔據固定的記憶體單元。

動態儲存區:

存放的是函式裡面的區域性變數、函式的返回值、形式引數等,它在函式被執行的過程中自動進行動態分類,在執行完成該函式之後自動釋放。由於這種分配和釋放都是每次執行到函式時候進行的,因此前後兩次同乙個函式,其臨時變數分配到的位址可能是不同的。

(2)儲存類別和相應的變數

①自動(auto)

非靜態變數的區域性變數即為自動變數,其型別說明符為auto, 在c 語言中,將函式內沒有儲存類別說明的變數均視為自動變數,即自動變數可以省去說明符auto。如:

void print()

等價於void print()

②暫存器(register)

指定了register 儲存類別的變數即為暫存器變數。使用暫存器變數是為了提高執行效率,因為頻繁地從記憶體單元訪問變數相比於從暫存器中訪問變數需要消耗更多的時間,所以使用register 宣告的暫存器型別的變數存放在暫存器中,不會占用記憶體單元,可以提高程式的執行效率。值得注意的一點是,只有區域性變數才可以定義成暫存器變數。為了加深讀者的印象,我們通過下面兩段**來對比不使用register 和使用register 的程式執行效率。

不用register 的程式如下:

int main(int argc, char * argv)

不用register 的程式的執行結果:

root@ubuntu:/home# ./ce

執行時間為:35.608037

用register 的程式如下:

#include #include int main(int argc, char * argv)

用register 的程式的執行結果:

root@ubuntu:/home# ./ce

執行時間為:9.678347

對比上面的兩個執行結果,我們發現,使用了register 的程式執行速度提高了近3 倍,但是讀者要注意,雖然可以使用register 來提高程式的執行速度,但是也不能大量使用register,因為暫存器的數目是有限的。

③靜態(static)

關於靜態變數,值得注意的一點是,它的生存期是從程式開始執行到程式執行結束。靜態變數不屬於動態儲存,是靜態儲存。靜態區域性變數的生存期雖然是從程式開始執行到程式執行結束,但是它的作用域並不會因此而改變,而且仍然與其作為自動變數的作用域相同。靜態全域性變數的特點是,它只能在被定義的源程式檔案中使用,即它只能被本源程式檔案的函式呼叫,而不能被其他的源程式檔案中的函式呼叫。靜態區域性變數和靜態全域性變數的定義形式都是在資料型別前加上乙個靜態儲存定義符static。但是值得注意的是,兩者的初始化方式不同,靜態區域性變數在它所在的函式被執行時初始化,之後再次執行該函式時,該靜態區域性變數不再進行初始化,其中保留的是上一次的執行結果;而靜態全域性變數的初始化是在執行main() 函式之前完成的,其靜態全域性變數的當前值由最近一次對它的賦值操作決定。

在此,我們重點來看看靜態區域性變數的使用。

#include void print(void)

int main(void)

執行結果:

靜態區域性變數a=0

靜態區域性變數a=1

分析執行結果可以得知,靜態區域性變數在初始化以後,再次執行該函式時靜態區域性變數儲存的是上一次的執行結果。

④外部(extern)

外部儲存類別定義方式為在全域性變數型別前面加上關鍵字extern,如果沒有指定全域性變數的儲存類別,則預設為extern。

(二)作用域

不少人在程式設計中並不重視作用域的問題,實際上,它是c 語言程式設計中的乙個要點。通常來說,一段程式**中所用到的名字並不總是有效或可用的,而限定這個名字的可用性的**範圍就是這個名字的作用域。

C語言的變數的作用域和生存期

c語言程式可以看成由一系列外部物件構成,這些外部物件可能是變數或函式。而內部變數是指定義在函式內部的函式引數及變數。外部變數定義在函式之外,因此可以在許多函式中使用。由於c語言不允許在乙個函式中定義其它函式,因此函式本身只能是 外部的 由於c語言 是以檔案為單位來組織的,在乙個源程式所有原始檔中,乙...

C語言記憶體分割槽,變數的作用域和生存週期

記憶體分為棧區 stack 堆區 heap 全域性區 靜態區 data區 區 text segment 四個區。而每乙個記憶體分割槽,又起著不同的作用。區 text segment 載入的是可執行檔案 段,所有的可執行 都載入到 區,這塊記憶體是不可以在執行期間修改的。作用域 就是變數的範圍 生命週...

C語言中變數的作用域和生存期

幾個基本概念 靜態儲存區 程式執行期間系統分配的固定的儲存空間。動態儲存區 程式執行期間根據需要進行動態分配的記憶體空間。靜態儲存區和動態儲存區都在記憶體中。作用域 變數可被使用的範圍。生存期 變數在程式執行過程中存留時間。全域性變數 外部變數 全域性變數全部存放在靜態儲存區 作用域從變數定義處開始...