(1)靜態區域性變數在函式內定義,但不象自動變數那樣,當呼叫時就存在,退出函式時就消失。靜態區域性變數始終存在著,也就是說它的生存期為整個源程式。
(2)靜態區域性變數的生存期雖然為整個源程式,但是其作用域仍與自動變數相同
,即只能在定義該變數的函式內使用該變數。退出該函式後, 儘管該變數還
繼續存在,但不能使用它。
(3)允許對構造類靜態區域性量賦初值。若未賦以初值,則由系統自動賦值。數值型變數自動賦初值0,字元型變數賦空字元。
(4)對基本型別的靜態區域性變數若在說明時未賦以初值,則系統自動賦予0值。而對自動變數不賦初值,則其值是不定的。 根據靜態區域性變數的特點, 可以看出它是一種生存期為整個原始檔的量。雖然離開定義它的函式後不能使用,但如再次呼叫定義它的函式時,它又可繼續使用, 而且儲存了前次被呼叫後留下的值。 因此,當多次呼叫乙個函式且要求在呼叫之間保留某些變數的值時,可考慮採用靜態區域性變數。雖然用全域性變數也可以達到上述目的,但全域性變數有時會造成意外的***,因此仍以採用區域性靜態變數為宜。
#include
#include
using namespace std;
int fun()
int main()
// printf("%d\n",b);//如果這樣會出現未定義
return 0;
}————————————————————————
先說說c中的靜態變數和靜態函式。(1)c中的靜態變數是處於全域性儲存區,區別於自動變數的儲存於棧中。兩者的關鍵區別是其作用域的區別。自動變數的作用域處於其所在的函式或語句塊中;而靜態變數的作用域起始於其定義處,終止於程式結束處。(2)c中的靜態函式主要是限制函式的名字以及可訪問域於檔案中,表示此函式僅供此檔案所用,不允許在其他檔案中呼叫的。有關靜態函式的使用可以考慮幾點:一是靜態函式的名字僅可見於其所定義的檔案。這就允許在不同的檔案中存在同名的靜態函式。可以利用此特性將本檔案常用的**抽象出來成為函式,而在使用此段**的地方直接呼叫函式即可。這樣允許用簡短的名詞定義此函式。我的體驗,在面臨定義功能相同的函式是,為他們取乙個美麗的名字其實很困難,而在使用上對名字的記憶也頗費苦心。而用靜態函式可以省力許多。而普通函式是可以全域性訪問的,而且在c中沒有名字空間的概念,所以對c中函式的命名頗費苦心。
再說c++中的靜態成員變數和靜態成員函式。(1)類靜態資料成員在編譯時建立並初始化:在該類的任何物件建立之前就存在,不屬於任何物件,而非靜態類成員變數則是屬於物件所有的。類靜態資料成員只有乙個拷貝,為所有此類的物件所共享。特別需要注意的一點是:靜態資料成員不能在類中初始化(對於常量靜態類變數有待考證,好像可以在類外或main()函式之前定義,初始化可以放在類中),一般在類外和main()函式之前初始化,預設時初始化為0。靜態資料成員用來定義類的各個物件所公有的資料,比全域性變數更安全。(2)類靜態成員函式屬於整個類,不屬於某個物件,由該類所有物件共享。靜態成員可定義為inline函式。一般情況下靜態成員函式用於訪問同一類中的靜態資料成員或全域性變數,而不訪問非靜態成員,如需訪問非靜態成員,需要將物件作為引數,通過物件名訪問該物件的非靜態成員。靜態成員函式也可以在類外定義,此時不可以用static修飾。靜態成員函式存在的原因是什麼呢?主要是在建立任何物件之前可用它來訪問靜態資料成員,普通函式不能實現此功能。
c++靜態成員和靜態成員函式的使用:靜態成員的呼叫格式:類名::靜態資料成員名、物件名.靜態資料成員名、物件指標->靜態資料成員、物件引用.靜態資料成員(但類中很少會出現公有資料成員,這段僅僅討論語法,未考慮實際運用中的資料封裝問題)。靜態成員函式的呼叫格式:類名::靜態成員函式名、物件名.靜態成員函式名、物件指標->靜態成員函式名、物件引用.靜態資料成員。靜態成員函式沒有this指標,因它不與特定物件相聯絡,呼叫時推薦使用「類名::靜態成員函式名」格式。總結來說,在有物件的情況下,可以用呼叫普通類成員函式、普通成員變數的方式呼叫靜態成員函式和靜態成員變數。從這裡可以看出靜態成員變數和靜態成員函式的使用應該是在不建立任何物件的情況下呼叫它們。其應用可以參見設計模式中singleton pattern。
C C 區域性靜態變數
對於乙個完整的程式,在記憶體中的分布情況如下。區全域性資料區 堆區棧區 區存放程式編譯後的可執行 一般程式的由new產生的動態資料存放在堆區 程式內部的自動變數存放在棧區。自動變數一般會隨著函式的退出而釋放空間。靜態資料 即使是函式內部的靜態區域性變數 也存放在全域性資料區,全域性資料區的資料並不會...
c c 靜態變數和靜態函式
c語言中需要記憶體來存放資料。而記憶體主要分為兩類 靜態儲存區和動態儲存區 靜態儲存區分為 唯讀資料 readonly data 區 以讀寫資料 rw data 區 未初始化區 bss 它們都是在程式編譯連線階段確定的,在程式執行的階段不會改變。動態儲存區分為堆和棧。都是程式執行的過程中動態分配的,...
C C 靜態變數與靜態函式
1 c c 的靜態變數是分配於靜態資料區,程式執行過程中一直存在,即變數的位址在程式執行過程中不變 如果重複申請同乙個靜態變數,則重複申請的無效 include void fn void main void fn setinitial set return tmp mapinitial map re...