存儲類別,鏈接,內存管理
作用域:
塊作用域~是一對花括號括起來的區域,可見範圍是從定義開始到快結尾,整個函數體也是一個塊,雖然函數的形式參數在函數的左花括號前,但是屬於函數體這個塊,以前具有塊作用域的必須聲明快的開頭,int x; for(x;;){} // c99之前,c99放寬限制推薦這樣寫 for(int x ; ;)對於for while do while if 語句所控制的代碼,即使這些代碼沒用括號括起來,也算是塊的一部分
函數作用域~僅用於goto語句,如果標簽首次出現在函數體的內部,它的作用域也延伸整個函數。
函數原型作用域~從形參定義到形參定義結束。
文件作用域~定義在函數的外面,從定義開始到文件末尾都可以使用
鏈接:
具有塊作用域,函數作用域,或是函數原型作用域的變量都是無鏈接變量;
外部鏈接可以在多個翻譯單元中使用,內部鏈接只能在一個翻譯單元(一個源文件代碼和它所包含的頭文件)使用,定義文件作用域默認為外部鏈接,static int x=1; 為內部鏈接,int x 內部鏈接
存儲期:
作用域和鏈接描述了標識符的可見性。 存儲期描述了通過這些標識符訪問的對象的生存期靜態存儲期:
文件作用域 變量具有靜態存儲期 , 程序執行的過程都存在
線性存儲期用於並發程序設設計,程序執行分為多個線程具有線性存儲期的對象從被聲明,到線性結束一直存在
塊作用域具有自動存儲期 當程序進入塊時,分配內存,退出時釋放剛才變量分配的內存然而塊區域變量也有靜態存儲區, 變量前面加入static 關鍵字
) 可以顯示使用auto 關鍵詞。auto 關鍵詞和c++不同 如果編寫c和c++兼容的程序最好不要使用。
塊作用域的靜態變量:
程序在所離開的塊之後,該變量不會被銷毀。可以用指針訪問。並且默認初始化為零,不能在函數的形參使用static
外部鏈接的靜態變量:
int m=1// 1.cpp;
extern int m int main(){}//2.cpp 如果m定義在另一個文件中必須聲明這樣使用
還有一種情況
#include<stdio.h>//1.cpp extern int m; void showm() { extern int m;//可加可不加 printf("%d ", m); } int main() { int m = 10; printf("%d", m); showm(); } int m = 1;//2.cpp
內部靜鏈接的靜態變量:
#include<stdio.h> int c = 1; void showm() { extern int c; //表明使用的是 全局變量c printf("%d ",c); } int main() { //extern int c 會顯示重復定義 int c = 10; printf("%d", c); showm(); }
int tern=1;//被定義 ,定義式聲明只能初始化一次。
main()
{ extern int tern //使用別處定義的 tern 引用式聲明,指示編譯器去別處查找定義。即extern int tern=1 錯誤
寄存器變量 register int quick ;通常使用在循環中,塊作用域,自動存儲期,無連接。 void macho (register int m)
C99 Standard
存儲類別,鏈接,內存管理