變數的儲存方式可分為「靜態儲存」和「動態儲存」兩種。
靜態儲存變數通常是在變數定義時就分定儲存單元並一直保持不變,直至整個程式結束。
動態儲存變數是在程式執行過程中,使用它時才分配儲存單元,使用完畢立即釋放。
典型的例子是函式的形式引數,在函式定義時並不給形參分配儲存單元,只是在函式被呼叫時,才予以分配,呼叫函式完畢立即釋放。如果乙個函式被多次呼叫,則反覆地分配、釋放形參變數的儲存單元。
從以上分析可知,靜態儲存變數是一直存在的,而動態儲存變數則時而存在時而消失。我們又把這種由於變數儲存方式不同而產生的特性稱變數的生存期。生存期表示了變數存在的時間。生存期和作用域是從時間和空間這兩個不同的角度來描述變數的特性,這兩者既有聯絡,又有區別。乙個變數究竟屬於哪一種儲存方式,並不能僅從其作用域來判斷,還應有明確的儲存型別說明。
在c語言中,對變數的儲存型別說明有以下四種:
auto自動變數
register暫存器變數
extern外部變數
static靜態變數
自動變數和暫存器變數屬於動態儲存方式,
外部變數和靜態變數屬於靜態儲存方式。
在介紹了變數的儲存型別之後,可以知道對乙個變數的說明不僅應說明其資料型別,還應說明其儲存型別。因此變數說明的完整形式應為:儲存型別說明符資料型別說明符變數名,變數名…;例如:
static int a,b;說明a,b為靜態型別變數
auto char c1,c2;說明c1,c2為自動字元變數
static int a[5]=;說明a為靜整型陣列
extern int x,y;說明x,y為外部整型變數
下面分別介紹以上四種儲存型別:
一、自動變數的型別說明符為auto
這種儲存型別是c語言程式中使用最廣泛的一種型別。c語言規定,函式內凡未加儲存型別說明的變數均視為自動變數,也就是說自動變數可省去說明符auto。在前面各章的程式中所定義的變數凡未加儲存型別說明符的都是自動變數。例如:
void main(void)
等價於:
自動變數具有以下特點:
1.自動變數的作用域僅限於定義該變數的個體內。在函式中定義的自動變數,只在該函式內有效。在復合語句中定義的自動變數只在該復合語句中有效。例如:
int kv(int a)
/*c的作用域*/
……} /*a,x,y的作用域*/
2.自動變數屬於動態儲存方式,只有在使用它,即定義該變數的函式被呼叫時才給它分配儲存單元,開始它的生存期。函式呼叫結束,釋放儲存單元,結束生存期。因此函式呼叫結束之後,自動變數的值不能保留。在復合語句中定義的自動變數,在退出復合語句後也不能再使用,否則將引起錯誤。例如以下程式:
main()
printf("s=%d p=%d\n",s,p);
}printf("s=%d p=%d\n",s,p);
}s,p是在復合語句內定義的自動變數,只能在該復合語句內有效。而程式的第9行卻是退出復合語句之後用printf語句輸出s,p的值,這顯然會引起錯誤。
3.由於自動變數的作用域和生存期都侷限於定義它的個體內(函式或復合語句內),因此不同的個體中允許使用同名的變數而不會混淆。即使在函式內定義的自動變數也可與該函式內部的復合語句中定義的自動變數同名。例5.14表明了這種情況。
[例5.14]
main()
printf("s=%d p=%d\n",s,p);
}本程式在main函式中和復合語句內兩次定義了變數s,p為自動變數。按照c語言的規定,在復合語句內,應由復合語句中定義的s,p起作用,故s的值應為a+ a,p的值為a*a。退出復合語句後的s,p應為main所定義的s,p,其值在初始化時給定,均為100。從輸出結果可以分析出兩個s和兩個p雖變數名相同,但卻是兩個不同的變數。
4.對構造型別的自動變數如陣列等,不可作初始化賦值。
二、外部變數外部變數的型別說明符為extern
在前面介紹全域性變數時已介紹過外部變數。這裡再補充說明外部變數的幾個特點:
1. 外部變數和全域性變數是對同一類變數的兩種不同角度的提法。全域性變是是從它的作用域提出的,外部變數從它的儲存方式提出的,表示了它的生存期。
2. 當乙個源程式由若干個原始檔組成時, 在乙個原始檔中定義的外部變數在其它的原始檔中也有效。例如有乙個源程式由原始檔f1.c和f2.c組成: f1.c
int a,b; /*外部變數定義*/
char c; /*外部變數定義*/
main()
f2.c
extern int a,b; /*外部變數說明*/
extern char c; /*外部變數說明*/
func (int x,y)
在f1.c和f2.c兩個檔案中都要使用a,b,c三個變數。在f1.c檔案中把a,b,c都定義為外部變數。在f2.c檔案中用extern把三個變數說明為外部變數,表示這些變數已在其它檔案中定義,並把這些變數的型別和變數名,編譯系統不再為它們分配記憶體空間。 對構造型別的外部變數, 如陣列等可以在說明時作初始化賦值,若不賦初值,則系統自動定義它們的初值為0。
在宣告區域性變數時,預設均是 auto,這類變數都是動態分配儲存空間的,資料儲存在動態儲存區中。
const定 義不可更改的常量值
const int a;
const int *p;
int const *p;
int* const p;
int const * const p;
你需要了解一下:
本質:const在誰後面誰就不可修改,const在最前面則將其後移一位即可,二者等效
static 定義靜態變數
1)在函式體內,乙個被宣告為靜態的變數,使用關鍵字 static 將區域性變數指定為「靜態區域性變數」,這樣在函式呼叫結束後不消失而保留原值,即占用的儲存單元不釋放,在下一次函式呼叫時,該變數已有值就是上次函式呼叫結束時的值。
2)在模組內(靜態全域性變數)(但在函式體外),乙個被宣告為靜態的變數可以被模組內所用函式訪問,但不能被模組外其它函式訪問。它是乙個本地的全域性變數。
3)在模組內,乙個被宣告為靜態的函式只可被這一模組內的其它函式呼叫。那就是,這個函式被限制在宣告它的模組的本地範圍內使用。
register cpu內部寄存的變數
在宣告動態區域性變數或者函式形參時,可將變數宣告為register,這樣編譯系統就會為變數分配乙個暫存器而不是記憶體空間,通過這種方式可提公升對某些區域性變數頻繁呼叫的程式的效能。(暫存器運算速度遠高於記憶體)
extern 在其它程式模組中說明了全域性變數
用於擴充套件全域性變數的作用域,比如如果函式想引用乙個外部變數,但該外部變數在該函式後定義,那麼這個函式需要使用 extern 來宣告變數,這樣才能使用在該函式後面定義的全域性變數。此外,extern 還可以在多檔案的程式中宣告外部變數。
全域性變數 :在函式外定義的變數,可以為本原始檔中其它函式所公用,有效範圍為從定義變數的位置開始到本原始檔結束,這種型別的變數就稱為「全域性變數」。
修飾符,關鍵字
params修飾符 注 引數的最後乙個修飾符用於向方法傳遞數量不定的引數,關鍵字params必須與乙個單獨的一維陣列,並且應該是引數列表的最後一項,並且每個方法宣告中,只能有乙個params修飾符。如下所示 static void main name console.writeline ssn ss...
c語言的關鍵字之修飾符
const修飾的是在它前面的型別,如果它前面沒有型別,那它修飾的是緊跟著它的那個型別。const type name value 或 type const name value 復引用運算子 dereferencing operator 常稱為間接運算子 indirection operator 返...
關鍵字 許可權修飾符
關鍵字,表示當前物件 當前 是哪個物件在執行,則this就只帶哪個物件 this的使用場景 this.屬性 或其當前物件的屬性值 this.屬性 值 設定當前物件的屬性值 this.方法名 呼叫當前物件的方法this語句 通過this來在構造方法中呼叫當前物件的其他構造方法格式 this 引數列表 ...