1. 程式人生 > >love coding

love coding

c語言有五種不同型別的儲存類,瞭解他們會十分有助於對c語言的理解程度。


描述c語言的儲存類有作用域,連結型別以及儲存時期三種描述方法。


作用域是用來描述變數的可以引用的區域的一個概念,一般情況下使用的都是程式碼塊作用域,就是在一塊程式碼的{}內部有用的區域,還有一種叫做檔案作用域,就是從他開始定義的地方開始到檔案結束的地方都有用,這一般叫做全域性變數。


連結型別有兩種,一種是內連結,一種是外聯結,還有空連結。具有程式碼塊作用域的叫做空連結,具有檔案作用域的一般有內連結或者外連結,一個有外連結的可以在任何一個檔案裡邊引用,一個有內連結的可以僅僅在當前檔案裡邊引用,標識內連結的用關鍵字static。


儲存時期是表示一個變數會在程式執行的什麼時候存在的概念,有靜態儲存時期和動態儲存時期兩種,一般的程式碼塊作用域都是動態儲存時期,全域性變數是靜態儲存時期,static標識著她是一個內連結而不是靜態儲存區域,這一點要注意。比如一個標識了static檔案作用域變數具有內連結,沒有static標識是具有外連結,但是無論有沒有static關鍵字,都代表靜態儲存時期。動態儲存時期代表著,進入這個程式碼塊的時候,這個變數會被初始化,但是結束這個程式碼塊的時候就會把這個記憶體快釋放。靜態記憶體塊代表著在程式執行的整個時間這個變數都會存在。


而儲存類有五種,分別是自動,暫存器,具有外部連結的靜態儲存類,具有內部連線的儲存類,空連結的靜態類。


自動型別的儲存類,擁有程式碼塊作用域,自動儲存時期,空連結。一般用aoto標識,但是沒有的話,預設是aoto。如果在一個程式碼塊裡邊有一個和外部的變數同名的變數的話,就會覆蓋外部的變數。


暫存器變數是用register標示符來標識的,有程式碼塊作用域,空連結,自動儲存時期。暫存器是存在cpu內的硬體設施,可以供cpu更快的訪問,如果一個變數經常的訪問的話,可以設定為暫存器變數,但是這僅僅是一種請求,編譯器會根據當前的cpu以及記憶體情況來採取措施。


具有空連結的靜態變數,也稱為具有程式碼塊作用域的靜態變數,這就代表著,這個變數僅僅在這個程式碼塊內部可以被訪問到,但是儲存時期確實靜態的,在整個程式內都會存在。
例如以下程式碼:
void test()
{
static int a  =0;
a++;
printf("%d",a);
}
int main()
{
test();
test();
return 0;
}


就會輸出:
01


具有外部連結的靜態變數,代表這個變數具有靜態儲存時間,並且有外部連結,可以被任何檔案使用,具有檔案作用域。一般預設初始化為0。在其他檔案使用的時候需要宣告extern int a;才可以。


具有內部連線的靜態變數是具有靜態儲存時期,但是隻能在單個檔案內可以使用。就是在外部用static宣告的全域性變數而已。


同時,函式也有靜態的概念,在檔案裡定義的函式可以被外部檔案使用,但是加上了static關鍵字以後就會僅僅會被當前檔案使用了。