天天看點

C語言變量存儲類型auto static extern static extern register

C語言變量存儲類型

auto

static

extern

static extern

register

auto 局部變量

auto 變量是用堆棧(stack)方式占用儲存器空間,是以,當執行此區段是,系統會立即為這個變量配置設定存儲器空間,而程式執行完後,這個堆棧立即被系統收回.在大括号{}内聲明.

自動變量就是指在函數内部定義使用的變量。他隻是允許在定義他的函數内部使用它。在函數外的其他任何地方都不能使用的變量。自動變量是局部變量,即它的區域性是在定義他的函數内部有效。當然這說明自動變量也沒有連結性,因為它也不允許其他的檔案通路他。由于自動變量在定義他的函數的外面的任何地方都是不可見的,是以允許我們在這個函數外的其他地方或者是其他的函數内部定義同名的變量,他們之間不會發生沖突的。因為他們都有自己的區域性,而且它沒有連結性(即:不允許其他的檔案通路他的)。來看看自動量的持續性。計算機在執行這個函數的時候,建立并為它配置設定記憶體,當函數執行完畢傳回後,自動變量就會被銷毀。這個過程是通過一個堆棧的機制來實作的。為自動變量配置設定記憶體就壓棧,而函數傳回時就退棧。

static 靜态變量

一、局部靜态變量

局部變量按照存儲形式可分為三種auto, static, register。

與auto類型(普通)局部變量相比, static局部變量有三點不同:

1. 存儲空間配置設定不同

auto類型配置設定在棧上, 屬于動态存儲 類别, 占動态存儲區空間, 函數調用結束後自動釋放, 而static配置設定在靜态存儲 區, 在程式整個運作期間都不釋放. 兩者之間的作用域(有效範圍)相同, 但生存期不同.

2. static局部變量在所處子產品在初次運作時進行初始化工作, 且隻操作一次 。

3. 對于局部靜态變量, 如果不賦初值, 編譯期會自動賦初值0或空字元 , 而auto類型的初值是不确定 的.

特點: static局部變量的”記憶性 ”與生存期的”全局性”

所謂”記憶性”是指在兩次函數調用時, 在第二次調用進入時, 能保持第一次調用退出時的值.

注意事項:

1. “記憶性”, 程式運作很重要的一點就是可重複性, 而static變量的”記憶性”破壞了這種可重複性, 造成不同時刻至運作的結果可能不同.

2. “生存期”全局性和唯一性. 普通的local變量的存儲空間配置設定在stack上, 是以每次調用函數時, 配置設定的空間都可能不一樣, 而static具有全局唯一性的特點, 每次調用時, 都指向同一塊記憶體, 這就造成一個很重要的問題 ---- 不可重入性!!!

二、外部靜态變量/函數

在C中static有了第二種含義:用來表示不能被其它檔案通路的全局變量和函數。, 但為了限制全局變量/函數的作用域, 函數或變量前加static使得函數成為靜态函數。但此處“static”的含義不是指存儲方式,而是指對函數的作用域僅局限于本檔案(是以又稱内部函數 )。注意此時, 對于外部(全局)變量, 不論是否有static限制, 它的存儲區域都是在靜态存儲區, 生存期都是全局的.此時的static隻是起作用域限制作用, 限定作用域在本子產品(檔案)内部.

使用内部函數的好處是:不同的人編寫不同的函數時,不用擔心自己定義的函數,是否會與其它檔案中的函數同名。

extern 變量

外部變量 定義在程式外部,所有的函數很程式段都可以使用.

外部變量可能會在某一程式段被重新定義,以段内變量為參考值.

static extern 變量

靜态外部變量和外部變量差别在于,外部變量生命可以同時給多個檔案使用,而靜态外部變量則隻能給聲明此變量的檔案使用.

繼續閱讀