變量的生老病死
所有變量都占着內存,變量什么時候開始占着內存,什么時候從內存中消失,這叫做變量的生存周期。
按照變量的生存周期分類有:
※自動變量auto
※靜態變量static
※寄存器變量register
※外部變量extern
※函數也有外部函數extern和靜態函數static兩種
變量作用域
有時候變量還未消亡,你卻不能使用它,這就是變量作用域在作怪。
按照變量作用域分局部變量和全局變量。它們沒有什么關鍵字修飾,只是看你在什么部位定義變量。
從變量生存期和作用域來分析幾種不同種類變量的特性。
局部變量
定義局部變量的關鍵字為auto,也叫自動變量。
C語言規定自動變量在定義時前面的auto可以省略。
如:int a; 等價於 auto int a;
全局變量
在函數外面定義的變量都是全局變量,不管它用什么關鍵字修飾。
全局變量的特點:
※全局變量的生存期和作用域在從它的定義點開始,一直到本文件的程序結束前,都是有效的,程序結束后消亡,釋放內存。
※全局變量作用域中的所有函數將共享這個全局變量中的內存數據,各函數之間也可以通過全局變量傳送數據,但在職業程序員中,這是種很不好的習慣。
注意:在同一作用域中,如果局部變量與全局變量重名,全局變量將暫時退居幕后,這時只能操作局部變量。
程序1
局部變量和全局變量
// 38-1變量生存期.c #include <stdio.h> int a = 1, b = 2; //全局變量 void fun(int c,int d) { int a = 3, b = 4; //局部變量與全局變量重名,隱藏全局變量 auto int e = 5; //自動局部變量 int e = 5; 相等 int f = 6; //局部變量 printf("在fun函數中使用局部變量:c = %d\n", c); printf("在fun函數中使用局部變量:e = %d\n", e); printf("在fun函數中使用全局變量:a = %d\n", a); } int g = 10, h = 11; //全局變量 main() { int i = 12, j = 13; //局部變量 fun(i, h); printf("在main函數中使用全局變量:a = %d\n", a); printf("在main函數中使用全局變量:g = %d\n", g); }
靜態變量
靜態變量在程序執行點離開它的作用域時,它並不消亡,它還會死霸着那片內存不放,等着你別的函數下次來使用它。與全局變量不同的是:靜態變量通常在函數內部定義,而全局變量只能在函數外部定義。它們的共同點是:在程序結束時,它們都會消亡。
程序2
靜態變量
// 38-2靜態變量static.c // #include <stdio.h> void fun() { static int i = 0; //靜態局部變量 一直占用內存區 int a = 0; //局部變量 i++; a++; printf("靜態變量值:i = %d\n,自動變量值:a = %d\n", i, a); } main() { fun(); fun(); fun(); }
寄存器變量
寄存器變量不放在內存中,直接放在CPU寄存器中。因為CPU中的寄存器數量有限,所以寄存器變量不能設置太多。
寄存器變量的特點是:比普通內存速度快上百倍。
外部變量
如果一個文件要使用其它文件中的全局變量,就要使用extern聲明,這樣它就可以和其它文件共享此變量。