static與全域性變數相關總結

2021-07-23 13:27:41 字數 1959 閱讀 5129

1.區域性變數:在函式內定義的變數,作用域僅限於函式內。

2.全域性變數:定義在函式之外的變數,它的作用域從定義處開始,到所在檔案的結束。作用域是所在的整個檔案。

3.外部變數:乙個檔案中的全域性變數可以在另乙個檔案中作為外部變數使用,某個檔案中引用另乙個檔案中的全域性變數。用extern宣告,說明這個變數是在其他檔案中已經定義過的外部變數。那麼,該檔案不會為外部變數分配記憶體。

extern 型別說明符   外部變數名;

extern  int  student;

注意:全域性變數是外部變數;

1.靜態儲存變數:變數定義時就分配儲存單元並一直保持不變,直至整個程式結束。  

全域性變數屬於此類儲存方式。

靜態變數的型別說明符為:static

靜態變數當然是屬於靜態儲存方式,但是,屬於靜態儲存方式的變數不一定是靜態變數,如外部變數。

(1)在區域性變數的說明前加上static說明符就構成。

(2)生存期:靜態區域性變數在函式內定義,但它的生存期是整個程式。

(3)作用域:靜態區域性變數的生存期雖然為整個程式,但其作用域仍與自動變數相同。

只能在定義該變數的函式內使用。退出該函式後, 儘管該變數還繼續存在,但不能使用它。

(4)初始化:賦初值,若未賦初值,則由系統自動賦0值。

(5)只在第一次呼叫函式時給賦初值,再次呼叫定義它的函式時,靜態區域性變數儲存了前一次被呼叫後留下的值。因此,靜態變數用在:多次呼叫乙個函式且要求在呼叫之間保留某些變數的值時。

(1)在全域性變數的說明之前加上static。

(2)記憶體中的位置:靜態儲存區(靜態儲存區在整個程式執行期間都存在)

(2)全域性變數本身就是靜態儲存方式,靜態全域性變數當然也是靜態儲存方式,區別在作用域上:非靜態全域性變數作用域可以擴充套件到整個源程式,靜態全域性變數則侷限於乙個原始檔內,只能為該原始檔內的函式公用。因此,全域性變數加上static的限制,是為了避免在其他原始檔中引用,限制他不能作為另乙個檔案的外部變數,防止出現錯誤。

總結:區域性變數加上static,改變了他的儲存方式和生存期。

全域性變數加上static,限制了作用域,使用範圍。

static這個說明符在不同的地方所起的作用是不同的。

注:當static用來修飾區域性變數的時候,它就改變了區域性變數的儲存位置,從原來的

棧中存放改為靜態儲存區。但是區域性靜態變數在離開作用域之後,並沒有被銷毀,而是仍然駐留在記憶體當中,直到程式結束,只不過我們不能再對他進行訪問。

2.動態儲存變數:程式執行過程中,使用它時才分配儲存單元,使用完立即釋放。

eg:函式的形參,在函式定義時並不給形參分配儲存單元,只是在函式被呼叫時,才予以分配,函式呼叫完立即釋放。如果乙個函式被多次呼叫,則會多次分配和釋放形參變數的儲存單元。

自動變數是動態儲存方式。 自動變數型別說明符為:auto

凡未加儲存型別說明的變數均視為自動變數

注意:自動變數的作用域僅限於定義該變數的結構(函式或復合語句)內。

在函式的返回型別前加上關鍵字static,函式就被定義成為靜態函式。

函式的定義和宣告預設情況下是extern的,但靜態函式只是在宣告他的檔案當中可見,不能被其他檔案所用。關鍵字「static」,譯成中文就是「靜態的」,所以內部函式又稱靜態函式。但此處「static」的含義

不是指儲存方式

,而是指對函式的

作用域僅侷限於本檔案。 

靜態函式會被自動分配在乙個一直使用的儲存區,直到退出應用程式例項,避免了呼叫函式時壓棧出棧,速度快很多。

使用內部函式的好處是:

定義靜態函式的好處:

<1> 其他檔案中可以定義相同名字的函式,不會發生衝突。不同的人編寫不同的函式時,不用擔心自己定義的函式,是否會與其它檔案中的函式同名,因為同名也沒有關係。 

<2> 靜態函式不能被其他檔案所用。

static全域性變數 全域性變數

1 全域性變數 外部變數 的說明之前再冠以static 就構成了靜態的全域性變數。全域性變數本身就是靜態儲存方式,靜態全域性變數當然也是靜態儲存方式。這兩者在儲存方式上並無不同。這兩者的區別在於非靜態全域性變數的作用域是整個源程式,當乙個源程式由多個原始檔組成時,非靜態的全域性變數在各個原始檔中都是...

全域性變數與static

c 是沒有全域性變數的,c 設計者弄了乙個叫singleton的模式,用static可以當作全域性變數來用。請看下面的類 class class1 眾所周知,我們在主類裡面要想引用這個類,必須先class1 c1 new class1 要想c1.intnum則必須public int intnum而...

static全域性變數與普通的全域性變數

一 程式的記憶體分配 乙個由c c 編譯的程式占用的記憶體分為以下幾個部分 1 棧區 stack 由編譯器自動分配釋放 存放函式的引數值,區域性變數的值等。其操作方式類似於資料結構中的棧。2 堆區 heap 一般由程式設計師分配釋放,若程式設計師不釋放,程式結束時可能由os 注意它與資料結構中的堆是...