在網上看到一篇對靜態變數、區域性變數與全域性變數的講解,感覺解釋的很清晰~保留後用。
標籤: 靜態變數
區域性變數
全域性變數
原始出處 、作者資訊和本宣告。否則將追究法律責任。
最近重拾c++,學習到這幾個概念,涉及到堆疊的呼叫、分配等等,在這裡重新整理下,希與各位互相討論學習。
靜態資料成員在程式中只有乙份複製品,由該型別的所有物件共享訪問。非靜態資料成員則不然,每個類物件都有自己的複製品。
類的靜態成員必須初始化。如果靜態成員是個類,那麼就會呼叫它的建構函式。
靜態成員函式為類的全部服務而不是為某乙個類的具體物件服務。靜態成員函式由於不是與任何的物件相聯絡,因此它不具有this指標。
1
2
3
4
5
6
7
8
9
10
11
12
13
#include
void
fun(
int
i)
int
main()
程式輸出為
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include
void
fun(
int
i)
int
main()
程式輸出為
註解:static變數只初始化一次,具有「記憶」功能,與源程式「同生死,共存亡」。
auto變數存放在棧區,呼叫結束立刻被銷毀。
在標頭檔案中定義靜態變數 ,會浪費空間或者引起程式錯誤。因為若每個c語言檔案都使用了該標頭檔案,則在每個標頭檔案中會單獨列出乙個靜態變數。
不包含全域性變數定義的原始檔需要用extern關鍵字再次宣告這個全域性變數。
全域性變數、靜態區域性變數與靜態全域性變數都在靜態儲存區分配空間,而區域性變數在棧上分配空間。
全域性變數具有全域性作用域,靜態變數具有穩健作用域。
靜態區域性變數具有區域性作用域,只被初始化一次。靜態全域性變數具有檔案作用域,如果乙個程式包含多個檔案,只對宣告靜態全域性變數的檔案生效。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#include
static
int
j;
int
k=0;
int
m;
void
fun1()
void
fun2()
int
main()
printf
(
"%d\n"
,m);
printf
(
"%d\n"
,j);
return
0;
}
註解:i為靜態區域性變數,只被初始化一次。
j是靜態全域性變數,每次函式呼叫的時候都被初始化。
全域性變數只定義未初始化預設為0;
區域性變數只定義未初始化,若是int型別,則
預設的是-858993460,即0xcccccccc。
1
2
3
4
5
6
7
8
9
10
11
#include
int
my(
const
int
a)
int
main()
程式輸出結果入如下:
註解:printf函式總是從列表變數的右端開始計算壓棧,再從左到右對應彈出棧。
區域性變數可以與全域性變數重名,但是區域性變數會遮蔽全域性變數。要使用全域性變數,需要使用操作法::。
1
2
3
4
5
6
7
8
#include
int
i=1;
int
main()
程式輸出結果:
-858993460
註解:main函式裡面定義的i會遮蔽掉全域性變數i,致使定義的i=它本身,所以會輸出乙個隨機值。
本文出自 「大白菜」 部落格,請務必保留此出處
區域性變數,區域性靜態變數,全域性變數,全域性靜態變數分別
c 記憶體到底分幾個區?一 1 棧區 stack 由編譯器自動分配釋放 存放函式的引數值,區域性變數的值等。其操作方式類似於資料結構中的棧。2 堆區 heap 一般由程式設計師分配釋放,若程式設計師不釋放,程式結束時可能由os 注意它與資料結構中的堆是兩回事,分配方式倒是類似於鍊錶,呵呵。3 全域性...
全域性變數,全域性靜態變數,區域性靜態變數,區域性變數
變數可以分為全域性變數 靜態全域性變數 靜態區域性變數和區域性變數。按照儲存區分 全域性變數 靜態全域性變數和靜態區域性變數都存放在記憶體的全域性資料區,區域性變數存放在記憶體的棧區。按作用域分 全域性變數在整個工程檔案內都有效 靜態全域性變數只在定義它的檔案內有效 靜態區域性變數只在定義它的函式內...
區域性變數,區域性靜態變數,全域性變數,全域性靜態變數分別
c 記憶體到底分幾個區?一 1 棧區 stack 由編譯器自動分配釋放 存放函式的引數值,區域性變數的值等。其操作方式類似於資料結構中的棧。2 堆區 heap 一般由程式設計師分配釋放,若程式設計師不釋放,程式結束時可能由os 注意它與資料結構中的堆是兩回事,分配方式倒是類似於鍊錶,呵呵。3 全域性...