一 存儲(chǔ)類有關(guān)C語言的存儲(chǔ)類,推薦的參考資料:C PRimer Plus ,其中有一章專門講解這個(gè);在理解C的存儲(chǔ)類之前,首先要搞懂的概念有:作用域、生存周期、連接屬性C中的存儲(chǔ)類說明符實(shí)際上是上述屬性的不同組合作用域:一個(gè)C變量的作用域可以是
代碼塊作用域(在函數(shù)內(nèi)部代碼塊中定義的變量、形參,稱為局部變量),
函數(shù)原型作用域(從變量定義處一直到原型聲明的末尾),
文件作用域(一個(gè)在所有函數(shù)之外定義的變量,從定義處到包含定義的文件結(jié)尾處都可見,稱為全局變量),
函數(shù)作用域(只適應(yīng)于goto語句使用的標(biāo)簽),函數(shù)作用域意味著一個(gè)特定函數(shù)中的goto標(biāo)簽對(duì)該函數(shù)中任何地方的代碼都是可見的,無論該標(biāo)簽出現(xiàn)在哪一個(gè)代碼塊中。
連接:一個(gè)C變量具有以下連接之一
外部連接
內(nèi)部連接
空連接
具有代碼塊作用域和函數(shù)原型作用域的變量是空連接,由定義所在的代碼塊和函數(shù)原型所私有
具有外部連接的變量可以在多文件程序的任何地方使用,多個(gè)文件可有共享。
具有內(nèi)部連接的變量可以在一個(gè)文件的任何地方使用,歸該文件私有。
具有文件作用域的變量可能是內(nèi)部連接或者外部連接。
如果一個(gè)具有文件作用域的變量用static修飾,則是內(nèi)部連接,否則是外部連接。
存儲(chǔ)時(shí)期:一個(gè)C變量具有以下兩種存儲(chǔ)時(shí)期之一,靜態(tài)存儲(chǔ)時(shí)期(在程序執(zhí)行期間一直存在)和自動(dòng)存儲(chǔ)時(shí)期
靜態(tài)存儲(chǔ)時(shí)期:在程序執(zhí)行期間一直存在。具有文件作用域(不管是內(nèi)部連接還是外部連接)的變量具有此存儲(chǔ)周期,注意對(duì)于具有文件作用域的變量,static標(biāo)明連接類型不是存儲(chǔ)時(shí)期。
自動(dòng)存儲(chǔ)時(shí)期:具有代碼塊作用域的變量一般是自動(dòng)存儲(chǔ)周期。在程序進(jìn)入定義的變量代碼塊中時(shí)在棧中分配內(nèi)存,退出時(shí)釋放內(nèi)存。
5種存儲(chǔ)類
存儲(chǔ)類
| 時(shí)期 | 作用域 | 連接 | 聲明方式 |
自動(dòng) | 自動(dòng) | 代碼塊 | 空 | 代碼塊內(nèi) |
寄存器 | 自動(dòng) | 代碼塊 | 空 | 代碼塊內(nèi),使用關(guān)鍵字register |
具有外部連接的靜態(tài) | 靜態(tài) | 文件 | 外部 | 所有函數(shù)之外 |
具有內(nèi)部連接的靜態(tài) | 靜態(tài) | 文件 | 內(nèi)部 | 所有函數(shù)之外,使用關(guān)鍵字static |
空連接的靜態(tài) | 靜態(tài) | 代碼塊 | 空 | 代碼塊內(nèi),使用關(guān)鍵字static |
自動(dòng)變量:用auto修飾或者不修飾就默認(rèn)屬于自動(dòng)存儲(chǔ)類的變量,具有自動(dòng)存儲(chǔ)周期、代碼塊作用域、空連接。在默認(rèn)下,在代碼快或者函數(shù)的頭部定義的任意變量都屬于自動(dòng)存儲(chǔ)類。
如果在內(nèi)層中使用和外層一樣名字的變量,則內(nèi)層會(huì)覆蓋外層變量,在程序離開內(nèi)層代碼塊時(shí),外部變量就恢復(fù)了其作用和之前的值。
對(duì)于自動(dòng)變量,除非顯式的初始化,否則不會(huì)自動(dòng)初始化。
寄存器變量:通過register聲明,放在寄存器而非內(nèi)存中,所以無法獲得其地址。注意,有時(shí)候雖然請(qǐng)求了把變量放于寄存器中,但是由于寄存器的個(gè)數(shù),并不一定能滿足,所以寄存器變量就成為了普通變量,不過依然不能對(duì)其取址。
具有代碼塊作用域的靜態(tài)變量:通過static修飾,如果不現(xiàn)實(shí)對(duì)其初始化,則自動(dòng)初始化為0(提供了靜態(tài)時(shí)期),在代碼塊內(nèi)聲明(提供了代碼塊作用域和空連接),創(chuàng)建具有代碼塊作用域兼具靜態(tài)存儲(chǔ)的局部變量。這些變量具有代碼塊作用域,空連接,靜態(tài)存儲(chǔ)時(shí)期。變量一旦被定義便一直存在直到程序結(jié)束。
Int main(void)
{
Int count;
For(count = 1;conut < 4;count ++)
{printf(”count = %d/n”,count);
F();}
Return 0;
}
Void F(void)
{
Int fade = 1;
Static int stay = 1;
Printf(“fade = %d and stay = %d/n”,fade++,stay++);
}
結(jié)果:
Count = 1
Fade = 1 and stay = 1;
Count = 2
Fade = 1 and stay = 2;
Count = 3
Fade = 1 and stay = 3;
這是因?yàn)殪o態(tài)變量和外部變量在程序調(diào)入內(nèi)存時(shí)已經(jīng)就位了,把這個(gè)語句放在f()中是為了告訴編譯器只有函數(shù)f()能看到該變量。
具有外部連接的靜態(tài)變量:具有文件作用域、外部連接、靜態(tài)時(shí)期(外部存儲(chǔ)類,外部變量)。
額外說明,外部變量只可進(jìn)行一次初始化,而且在定義的時(shí)候。
具有內(nèi)部連接的靜態(tài)變量:用static在所有函數(shù)的外部進(jìn)行定義來創(chuàng)建,靜態(tài)存儲(chǔ)時(shí)期、文件作用域、內(nèi)部連接。
二、存儲(chǔ)類說明符
Auto 標(biāo)明一個(gè)變量具有自動(dòng)存儲(chǔ)時(shí)期,該說明符只能用在具有代碼塊作用域的變量聲明中。
Register 只能用在具有代碼塊作用域的變量。請(qǐng)求一個(gè)變量存儲(chǔ)在寄存器中一邊快速使用,但是不能獲得改變量的地址。
Static 用于具有代碼塊作用域的變量聲明時(shí),使該變量具有靜態(tài)存儲(chǔ)時(shí)期,從而得以在程序運(yùn)行期間存在并保留其值,變量仍保留代碼塊作用域和空連接。若用于具有文件作用域的變量聲明時(shí),使該變量具有內(nèi)部連接。
Extern 表明在聲明一個(gè)在其他地方定義了的變量。
Const 將數(shù)據(jù)定為不變的,在只能定義聲明,以后不可改變其值。在指針中使用時(shí),const的位置決定是指針本身不變還是指針指向的數(shù)據(jù)不變。
Volatile 說明數(shù)據(jù)除了可以被程序修改外還可以被其他代理修改,主要用于編譯器優(yōu)化。
Restrict 只能用于修飾指針,限定的指針被認(rèn)為是提供了對(duì)其所在指向的數(shù)據(jù)塊的唯一訪問途徑。
參考文檔:
http://blog.csdn.net/joan11_3/article/details/9394497
新聞熱點(diǎn)
疑難解答
圖片精選
網(wǎng)友關(guān)注