普通變數,static變數

2021-10-04 09:07:46 字數 2005 閱讀 5276

普通變數,static變數雖然都是變數,但是他們有很大的區別,下面從儲存區域,初始化值,作用域,生命週期來辨析他們(在同乙個檔案下)。

//測試使用,無意義

void

add(

int a,

int b)

intmain()

結果

sum:

6356940

tmp的初始化值: 53

sum:

1944111648

通過結果可以得到結論

生命週期:只有在對應的大括號{}內,函式執行結束普通區域性變數自動釋放**。可以通過呼叫兩次函式,但是結果不一樣說明兩次變數不是同乙個東西,所以生命週期只有在所在的大括號{}執行期間。

作用域:由最後列印區域性變數失敗說明普通區域性變數在它所在的{}內;

初始化值:由結果可知,初始化值為隨機數

儲存區域:棧區

int num;

void

test()

intmain()

結果

全域性變數初始化值:0

10

void

test2()

intmain()

結果

&num:

4214796

靜態區域性變數初始值:0

&num:

4214796

生命週期:可以看到兩次呼叫位址不變,所以在程式結束時才結束生命週期。

作用域:賦值tmp失敗,所以作用域為在大括號{}內;

初始化值:由結果得知,為0

儲存區域:全域性資料區

static

int num;

void

test()

intmain()

結果

靜態全域性變數初始值:0

func:num =

10

tmp.h

int c;

static

int num;

test.h

#include

"tmp.h"

extern

int tmp;

//extern static int num; error

main.c

#include

#include

#include

"test.h"

intmain()

如果想要在其他檔案使用本檔案的普通全域性變數,可以在其他檔案使用extren關鍵字,注意格式為

extren 資料型別 變數名; 注意不能賦值,因為這個只是宣告。且要注意靜態全域性變數的作用域為檔案,不可以跨檔案使用。這個特性可以用做保護資料。

int

test()

intmain()

結果

1

2

靜態變數初始化值不可以為變數,且靜態變數只初始化一次,看上文的sta每次初始化為0,結果應該輸出兩個1,但是結果為乙個1乙個2。驗證上面是正確的。

int num;

intmain()

結果

&num :

4214868

0&num :

6356748

53

文中兩個同名的變數,但作用域不同,編譯器會呼叫那個的值呢?從結果得知,編譯器會選擇就近原則,呼叫離它最近的那個變數,並不是後面的覆蓋前面的值,它們是不同的兩個變數。靜態變數也是這樣。注意,並不允許兩個作用域相同的同名函式,這樣編譯器報錯。

static變數與普通變數的異同

1 static區域性變數與普通區域性變數的異同 相同點 都是區域性變數,在函式內部定義,僅能被該模組內部的語句所訪問。不同點 1 記憶體分配與釋放 static修飾的區域性變數在記憶體中存放在靜態儲存區,static修飾的區域性變數只有在整個程式結束的時候才會自動釋放。若下次呼叫該區域性變數所在的...

static修飾的變數和函式與普通變數函式的區別

全域性變數 外部變數 的說明之前再冠以static 就構成了靜態的全域性變數。全域性變數本身就是靜態儲存方式,靜態全域性變數當然也是靜態儲存方式。這兩者在儲存方式上並無不同。這兩者的區別雖在於非靜態全域性變數的作用域是整個源程式,當乙個源程式由多個原始檔組成時,非靜態的全域性變數在各個原始檔中都是有...

final變數和普通變數的區別

public class test public static void main string args string a handao final string b han string c han string d b dao string e c dao system.out.println...