C 語言裡靜態變數和全域性變數

2021-07-06 00:03:40 字數 1379 閱讀 2112

1. 全域性變數的作用域是整個專案,它只需要在乙個原始檔中定義就可以作用於所有的原始檔,其它不包括全域性變數定義的檔案需要用extern關鍵字再次宣告這個全域性變數。

2. 全域性變數、靜態全域性變數、靜態區域性變數都是在靜態儲存區(全域性資料區)中分配空間的,而區域性變數是在棧上分配空間的。

3. 全域性變數、靜態變數的生命期和程式生命期是一樣的,在程式結束之後作業系統會**空間。

4. 全域性變數和靜態變數都是儲存在靜態儲存區中,生命期和程式一樣,但是不同的是全域性變數的作用域是整個專案,而靜態全域性變數是當前程式檔案,靜態區域性變數則是當前函式體內。

全域性變數和靜態全域性變數、靜態區域性變數預設值都是0,也就是在沒有初始化變數值的時候預設為0。

5. 靜態變數包含靜態區域性變數和靜態全域性變數。

靜態區域性變數具有區域性作用域只對定義自己的函式可見,只被初始化一次,自從初始化一次之後直到程式執行期間一直都在。

靜態全域性變數具有全域性作用域作用於定義它的程式檔案但是不能作用於專案裡的其它檔案,這一點和全域性變數不同。靜態全域性變數可以被多次初始化。

6. 把區域性變數改變為靜態變數之後是改變了它的儲存方式和生命期。

把全域性變數改變為靜態變數之後是改變了它的作用域,限制了使用範圍

7. 看以下幾個例子

//測試靜態區域性變數

int fun(void)

for(int i = 0; i < 10; i++)

/*輸出結果是

1 2 3 4 5 6 7 8 9 10

*//*解釋如下

1. 靜態區域性變數只會被初始化一次,因此第一次呼叫fun函式的時候num被初始化為0

2. 然後每次呼叫的時候++num,第一次呼叫++num為1;第二次++num為2......

3. 靜態區域性變數的生命期是整個程式因此值可以儲存下來*/

//宣告乙個靜態全部變數

static int value;

//測試靜態全域性變數

void g(void)

for(int i = 0; i < 10; i++)

/*輸出1 1 1 1 1 1 1 1 1 1

解釋1. 靜態全域性變數可以被初始化多次,因為每次呼叫g函式都會對靜態全域性變數初始化為0

2. 每次value的值都初始化為0,++value為1,因此輸出的值為1

*///測試靜態區域性變數

int get(int x)

printf("%d %d\n", get(4), get(5));

/*輸出9 10

解釋:1.printf是乙個函式,根據函式引數入棧的順序是從右到左,則先呼叫get(5)再呼叫get(4)

2.呼叫get(5)的時候,count第一次被初始化為5,則返回10;第二次呼叫get(4)的時候count不再被初始化值為5返回9

*/

靜態變數和全域性變數

靜態資料成員和靜態函式 與類本身直接相關,而不是與類的各個物件保持關聯。通過在成員的宣告之前加上關鍵字static使得其與類關聯在一起。靜態資料成員的型別可以是算術型別 常量 引用 指標 類型別等。類似的,靜態成員函式也不與任何物件繫結在一起,它們不包含 this 指標。靜態成員函式不能宣告為 co...

靜態變數和全域性變數

一 全域性變數 1 在mymethod.h中 extern qstring real db path 2 在mymethod.cpp中 必須做這一步,這一步是為變數分配空間,如果不分配空間,使用的時候編譯不過 qstring real db path 3 在需要使用的地方,include mymet...

C 靜態變數 全域性變數 const

全域性陣列 不能被delete 作用域 區分名字的不同意義的上下文。c 中大多數作用域是用花括號界定的,名字從其宣告點到宣告所在作用域結束處都是可見的。include int main int sum 0 for int val 1 val 10 val sum return 1 名字main在花括...