靜態變數 區域性變數與全域性變數詳解

2021-06-22 20:52:08 字數 3633 閱讀 3169

在網上看到一篇對靜態變數、區域性變數與全域性變數的講解,感覺解釋的很清晰~保留後用。

標籤: 靜態變數

區域性變數

全域性變數

原始出處 、作者資訊和本宣告。否則將追究法律責任。

最近重拾c++,學習到這幾個概念,涉及到堆疊的呼叫、分配等等,在這裡重新整理下,希與各位互相討論學習。

靜態資料成員在程式中只有乙份複製品,由該型別的所有物件共享訪問。非靜態資料成員則不然,每個類物件都有自己的複製品。

類的靜態成員必須初始化。如果靜態成員是個類,那麼就會呼叫它的建構函式。

靜態成員函式為類的全部服務而不是為某乙個類的具體物件服務。靜態成員函式由於不是與任何的物件相聯絡,因此它不具有this指標。

1

2

3

4

5

6

7

8

9

10

11

12

13

#include

voidfun(inti)

intmain()

程式輸出為

1

2

3

4

5

6

7

8

9

10

11

12

13

14

#include

voidfun(inti)

intmain()

程式輸出為

註解: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

staticintj;

intk=0;

intm;

voidfun1()

voidfun2()

intmain()

printf("%d\n",m);

printf("%d\n",j);

return0;

}

註解:i為靜態區域性變數,只被初始化一次。

j是靜態全域性變數,每次函式呼叫的時候都被初始化。

全域性變數只定義未初始化預設為0;

區域性變數只定義未初始化,若是int型別,則

預設的是-858993460,即0xcccccccc。

1

2

3

4

5

6

7

8

9

10

11

#include

intmy(constinta)

intmain()

程式輸出結果入如下:

註解:printf函式總是從列表變數的右端開始計算壓棧,再從左到右對應彈出棧。

區域性變數可以與全域性變數重名,但是區域性變數會遮蔽全域性變數。要使用全域性變數,需要使用操作法::。

1

2

3

4

5

6

7

8

#include

inti=1;

intmain()

程式輸出結果:

-858993460

註解:main函式裡面定義的i會遮蔽掉全域性變數i,致使定義的i=它本身,所以會輸出乙個隨機值。

本文出自 「大白菜」 部落格,請務必保留此出處

區域性變數,區域性靜態變數,全域性變數,全域性靜態變數分別

c 記憶體到底分幾個區?一 1 棧區 stack 由編譯器自動分配釋放 存放函式的引數值,區域性變數的值等。其操作方式類似於資料結構中的棧。2 堆區 heap 一般由程式設計師分配釋放,若程式設計師不釋放,程式結束時可能由os 注意它與資料結構中的堆是兩回事,分配方式倒是類似於鍊錶,呵呵。3 全域性...

全域性變數,全域性靜態變數,區域性靜態變數,區域性變數

變數可以分為全域性變數 靜態全域性變數 靜態區域性變數和區域性變數。按照儲存區分 全域性變數 靜態全域性變數和靜態區域性變數都存放在記憶體的全域性資料區,區域性變數存放在記憶體的棧區。按作用域分 全域性變數在整個工程檔案內都有效 靜態全域性變數只在定義它的檔案內有效 靜態區域性變數只在定義它的函式內...

區域性變數,區域性靜態變數,全域性變數,全域性靜態變數分別

c 記憶體到底分幾個區?一 1 棧區 stack 由編譯器自動分配釋放 存放函式的引數值,區域性變數的值等。其操作方式類似於資料結構中的棧。2 堆區 heap 一般由程式設計師分配釋放,若程式設計師不釋放,程式結束時可能由os 注意它與資料結構中的堆是兩回事,分配方式倒是類似於鍊錶,呵呵。3 全域性...