以外部定義形式定義的變數稱為外部變數(又名全域性變數)與函式類似,外部變數也允許先使用後宣告,或在另乙個原始檔裡定義而在其他檔案裡被使用。
如果需要宣告乙個外部變數,要按照以下形式:
extern
int a;
//int可以是別的型別
這說明a在其他地方被定義(當然需要a真正的有被定義)。
e.g.在函式內寫
static
int m=
0;
引入的必要性:自動變數的上次資料無法儲存,雖然可以借助全域性變數,但是這樣別的函式也可以訪問這個變數(私有的資料),從而會導致程式不太安全。這對變數提出了另一種要求——其存在期是全域性的,但是作用域是區域性的。
e.g.在外部寫
static
int m=
0;
引入的必要性:乙個程式很大的時候,外部變數容易衝突,為了緩解這一問題,c語言提供了一種作用於被限制為源程式檔案的外部變數,定義的時間加上static即可。靜態外部變數能且只能再定義所在的原始檔裡使用。
警告:這與靜態區域性變數完全不同
自動建立和撤銷的變數,c語言稱其為自動變數。(復合語句開始時建立其中定義的變數,執行結束後銷毀其中的變數)
在其存在期裡總代表乙個值,不允許再賦值。
e.g.
const
int num=
10;
e.g.
register
int m=
0;
暫存器是 cpu裡面臨時資料儲存的單元,速度最快但數量最少,是緊缺資源。
register只是優化提示,實際安排還是由編譯器決定。
注意暫存器變數的特點是沒有位址(因為其不在記憶體中)
如果定義外部變數和區域性靜態變數時沒寫初始化部分,系統將自動賦予0。
自動變數如果不提供初始值,系統不做初始化。
變數的自動初始化
變數的初始化分為倆種型別 1.內建型別自動初始化。程式中有乙個資料區,存放已初始化的全域性變數,靜態變數和常量,所以會增加目標檔案的大小。還有乙個未初始化資料區bss 存放未初始化全域性變數,但是在程式開始執行之前,這些資料會被初始化為0或者null。所以bss資料在目標檔案中只佔乙個符號位,編譯器...
變數的自動初始化
1 1 include2 define const 100 3int p1 4int a 2 5 intb 6static intc 7main 8 輸出 const 100 a 0 0 b 0c 0 d 2514932 e 0f 0 1307813 p2 457819009 資料區存放已初始化的全...
各型別變數的自動初始化總結
前幾天給系統寫乙個新功能,被初始化問題搞毛了 乙個結構體裡包含列舉型別的變數,結果由於沒有初始化,搞了一堆隨機數 這個結構體是作為輸入引數放在查詢函式裡的,結果自然查不到。最悲劇的是,在我的windows平台可以成功查到,linux平台有一定機率能查到 如果乙個變數沒有進行初始化,那麼使用它的行為是...