国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學(xué)院 > 開發(fā)設(shè)計(jì) > 正文

C語言 存儲(chǔ)類說明符

2019-11-06 06:03:28
字體:
供稿:網(wǎng)友

一 存儲(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


發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 潞西市| 石城县| 中牟县| 远安县| 丁青县| 建阳市| 满城县| 建阳市| 东方市| 靖远县| 象州县| 时尚| 扎鲁特旗| 岳池县| 西乡县| 高雄市| 蓬莱市| 金坛市| 敖汉旗| 庆阳市| 绍兴市| 宽城| 贵溪市| 丰原市| 福清市| 汝城县| 阳曲县| 崇左市| 麦盖提县| 岳池县| 衡阳县| 都江堰市| 张家川| 泾阳县| 卓资县| 祥云县| 镶黄旗| 桐城市| 玉溪市| 辽阳县| 唐河县|