C static 的實現原理及其表現

2021-07-30 23:27:31 字數 1468 閱讀 6166

觀察以下**:

int teststatic()
我們定義了乙個static int (靜態整型,初值為10)在乙個函式中。

然後在主函式中執行如下**:

int  main()

system("pause");

return

0;}

得到如下結果:

- static count : 10 main function conut : 1

- static count : 9 main function conut : 2

- static count : 8 main function conut : 3

- static count : 7 main function conut : 4

- static count : 6 main function conut : 5

- static count : 5 main function conut : 6

- static count : 4 main function conut : 7

- static count : 3 main function conut : 8

- static count : 2 main function conut : 9

- static count : 1 main function conut : 10

可以看到,定義在teststatic()函式中的count的值好像並沒有每次都被初始化為10,而因此輸出十次一樣的數。

而是保持上一次被count–之後的值,很奇怪吧,這與static的特性有關。

static 的特性如下:

實現:

在程式被裝載進記憶體時,所有定義為 static 的變數已經完成了初始化,並被放在了程式段的全域性變數區,所以我們無論定義了多少次這個static的物件,記憶體中實際存在的變數還是只有這乙個。

無論這個static變數在我們看來作用於哪乙個範圍內,比如乙個函式中,函式結束後這個變數依然存在,並不會因為函式結束而被**。

總結

static的實現是通過將這個變數初始化在全域性變數區實現的,但與全域性變數不同,它具有可見性(也可以說隱藏性)。所以我們可以根據這個特性實現許多有趣的功能:

-作為物件間的一種通訊手段,如果乙個變數是類的一部分,但卻不是該類的各個物件的一部分,它就被稱為是乙個static靜態成員。乙個static成員只有唯一的乙份副本,而不像常規的非static成員那樣在每個物件裡各有乙份副本。同理,乙個需要訪問類成員,而不需要針對特定物件去呼叫的函式,也被稱為乙個static成員函式。所有的類都實際上訪問的是乙個static物件成員。

- 實現乙個區域性全域性變數,比如只在乙個.c檔案中適用的全域性變數

- ….

雜湊表原理及其應用

給定若干非負整數,範圍是 1 10000,編寫程式使得查詢乙個數的時間複雜度為 o 1 int data 10001 void insert int key intsearch int key 上述 的基本思想是將每個輸入的key,存放在陣列的key這個位置。我們假設陣列下標為a,對應位置的值為ke...

單向鍊錶和雙向鍊錶的原理及其相關實現

其實要解決乙個問題得從以下幾個方面入手?即在日常生活中的幾大 w 鍊錶是什麼?它有什麼作用?怎麼實現?在日常生活中有哪些實際應用?只要解決了這些問題,那麼鍊錶這個問題就會很清晰明了了。一 什麼是鍊錶?鍊錶是線性表的一種,所謂的線性表包含順序線性表和鍊錶,順序線性表是用陣列實現的,在記憶體中有順序排列...

跳表的原理及其實現

作用 目的 跳表作為一種資料結構通常用於取代平衡樹。起因平衡樹可以用於表示抽象的資料型別如字典和有序鍊錶,它通過樹旋轉 tree rotation 操作強制使樹結構保持平衡來保證節點搜尋的效率。在資料為隨機插入的情況下,平衡樹效能表現良好 但資料為順序插入或者需要刪除節點的情況下,平衡樹的效能就會有...