![十二變量的作用域和存儲(chǔ)類型_第1頁](http://file3.renrendoc.com/fileroot_temp3/2022-5/4/145b06d7-cc82-4d6d-bd8b-8ef738416ad4/145b06d7-cc82-4d6d-bd8b-8ef738416ad41.gif)
![十二變量的作用域和存儲(chǔ)類型_第2頁](http://file3.renrendoc.com/fileroot_temp3/2022-5/4/145b06d7-cc82-4d6d-bd8b-8ef738416ad4/145b06d7-cc82-4d6d-bd8b-8ef738416ad42.gif)
![十二變量的作用域和存儲(chǔ)類型_第3頁](http://file3.renrendoc.com/fileroot_temp3/2022-5/4/145b06d7-cc82-4d6d-bd8b-8ef738416ad4/145b06d7-cc82-4d6d-bd8b-8ef738416ad43.gif)
![十二變量的作用域和存儲(chǔ)類型_第4頁](http://file3.renrendoc.com/fileroot_temp3/2022-5/4/145b06d7-cc82-4d6d-bd8b-8ef738416ad4/145b06d7-cc82-4d6d-bd8b-8ef738416ad44.gif)
![十二變量的作用域和存儲(chǔ)類型_第5頁](http://file3.renrendoc.com/fileroot_temp3/2022-5/4/145b06d7-cc82-4d6d-bd8b-8ef738416ad4/145b06d7-cc82-4d6d-bd8b-8ef738416ad45.gif)
下載本文檔
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、一、作用域和生存期C程序的標(biāo)識(shí)符作用域有三種:局部、全局、文件。標(biāo)識(shí)符的作用域決定了程序中的哪些語句可以使用它,換句話說,就是標(biāo)識(shí)符在程序其他部分的可見性。通常,標(biāo)識(shí)符的作用域都是通過它在程序中的位置隱式說明的。1 .局部作用域前面各個(gè)例子中的變量都是局部作用域,他們都是聲明在函數(shù)內(nèi)部,無法被其他函數(shù)的代碼所訪問。函數(shù)的形式參數(shù)的作用域也是局部的,它們的作用范圍僅限于函數(shù)內(nèi)部所用的語句塊。voidadd(int);main()(intnum=5;add(num);printf(%dn,num);/*輸出5*/)voidadd(intnum)(num+;printf(%dn,num);/*輸出6
2、*/)上面例子里的兩個(gè)num變量都是局部變量,只在本身函數(shù)里可見。前面我們說了,在兩個(gè)函數(shù)出現(xiàn)同名的變量不會(huì)互相干擾,就是這個(gè)道理。所以上面的兩個(gè)輸出,在主函數(shù)里仍然是5,在add()函數(shù)里輸出是6。2 .全局作用域?qū)τ诰哂腥肿饔糜虻淖兞?,我們可以在程序的任何位置訪問它們。當(dāng)一個(gè)變量是在所有函數(shù)的外部聲明,也就是在程序的開頭聲明,那么這個(gè)變量就是全局變量。voidadd(int);intnum;main()(intn=5;add(n);printf(%dn,num);/*輸出6*/)voidadd(num)/*形式參數(shù)沒有指定類型*/(num+;printf(%dn,num);/*輸出6*/
3、上面的main()和add()里面,并沒有聲明num,但是在最后輸出的時(shí)候卻要求輸出num,這是由于在程序的開始聲明了num是全局變量,也就是在所有函數(shù)里都可以使用這個(gè)變量。這時(shí)候一個(gè)函數(shù)里改變了變量的值,其他函數(shù)里的值也會(huì)出現(xiàn)影響。上面的例子輸出都是6,因?yàn)樵赼dd()函數(shù)里改變了num的值,由于num是全局變量,就好象它們兩個(gè)函數(shù)共用一個(gè)變量,所以在main()函數(shù)里的num也隨之改變了。3 .文件作用域在很多C語言書上,都沒有說明文件作用域,或者只是略微的提到,其實(shí)文件作用域在較大程序中很有作用(在多文件系統(tǒng)中)。文件作用域是指外部標(biāo)識(shí)符僅在聲明它的同一個(gè)轉(zhuǎn)換單元內(nèi)的函數(shù)匯總可見。所謂轉(zhuǎn)
4、換單元是指定義這些變量和函數(shù)的源代碼文件(包括任何通過版聯(lián)八40指令包含的源代碼文件)。static存儲(chǔ)類型修飾符指定了變量具有文件作用域。staticintnum;staticvoidadd(int);main()(scanf(%d,&num);add(num)printf(%dn,num);voidadd(num)(num+;上面的程序中變量num和函數(shù)add()在聲明是采用了static存儲(chǔ)類型修飾符,這使得它們具有文件作用域,僅愛定義它們的文件內(nèi)可見。由于我們提到的大多數(shù)程序都只有一個(gè)編譯文件組成,所以這種寫法沒有實(shí)際意義。但是實(shí)際工程上的文件有很多,它們不是由一個(gè)人寫成的,由
5、很多人共同完成,這些文件都是各自編譯的,這難免使得某些人使用了一樣的全局變量名,那么為了以后程序中各自的變量和函數(shù)不互相干擾,就可以使用static修飾符,這樣在連接到同一個(gè)程序的其他代碼文件而言就是不可見的。二、變量存儲(chǔ)類型前面我們說了,聲明變量時(shí)用如下類似的形式:intnum;floattotal;它們都沒有存儲(chǔ)類型修飾符,我們?cè)诼暶鲿r(shí)也可以通過存儲(chǔ)類型修飾符來告訴編譯器將要處理什么類型的變量。存儲(chǔ)類型有以下四種:自動(dòng)(auto)、靜態(tài)(static)、外部(extern)、寄存器(regiser)。1 .自動(dòng)存儲(chǔ)類型自動(dòng)存儲(chǔ)類型修飾符指定了一個(gè)局部變量為自動(dòng)的,這意味著,每次執(zhí)行到定義該
6、變量的語句塊時(shí),都將會(huì)為該變量在內(nèi)存中產(chǎn)生一個(gè)新的拷貝,并對(duì)其進(jìn)行初始化。實(shí)際上,如果不特別指明,局部變量的存儲(chǔ)類型就默認(rèn)為自動(dòng)的,因此,加不加auto都可以。main()(autointnum=5;printf(%dn,num);)在這個(gè)例子中,不論變量num的聲明是否包含關(guān)鍵字auto,代碼的執(zhí)行效果都是一樣的。函數(shù)的形式參數(shù)存儲(chǔ)類型默認(rèn)也是自動(dòng)的。2 .靜態(tài)存儲(chǔ)變量前面已經(jīng)使用了static關(guān)鍵字,但是對(duì)于局部變量,靜態(tài)存儲(chǔ)類型的意義是不一樣的,這時(shí),它是和自動(dòng)存儲(chǔ)類型相對(duì)而言的。靜態(tài)局部變量的作用域仍然近局限于聲明它的語句塊中,但是在語句塊執(zhí)行期間,變量將始終保持它的值。而且,初始化值
7、只在語句塊第一次執(zhí)行是起作用。在隨后的運(yùn)行過程中,變量將保持語句塊上一次執(zhí)行時(shí)的值??聪旅鎯蓚€(gè)對(duì)應(yīng)的程序:intadd();intadd();main()main()intresult;intresult;result=add()result=add();printf(%d,result);printf(%d,result);result=add();result=add();printf(%d,result);printf(%d,result);result=add();result=add();printf(%d,result);printf(%d,result);)intadd()int
8、add()intnum=50;staticintnum=50;num+;num+;returnnum;returnnum;上面兩個(gè)源文件,只有函數(shù)add()里的變量聲明有所不同,一個(gè)是自動(dòng)存儲(chǔ)類型,一個(gè)是靜態(tài)存儲(chǔ)類型。對(duì)于1.C文件,輸出結(jié)果為515151;這很好理解,每次初始值都是50,然后加1上來。對(duì)于2.C文件,輸出結(jié)果為515253;這是由于變量是靜態(tài)的,只在第一次初始化了50,以后都是使用上次的結(jié)果值。當(dāng)?shù)谝淮握{(diào)用add()時(shí),初始化為50,然后加1,輸出為51;當(dāng)?shù)诙握{(diào)用時(shí),就不初始化了,這時(shí)num的值為上次的51,然后加1,輸出52;當(dāng)?shù)谌握{(diào)用時(shí),num為52,加1就是53了
9、。比較就會(huì)發(fā)現(xiàn)它們的不同之處了。靜態(tài)變量在下一節(jié)要說的遞歸函數(shù)中經(jīng)常使用到。當(dāng)?shù)谝淮尾恢该黛o態(tài)變量的初始值時(shí),默認(rèn)為0。下面舉一個(gè)例子,把我們說到的靜態(tài)變量理解一下。求1+2+100的值voidadd();intresult;main()(inti;result=0;for(i=0;i<100;i+)add();printf(%dn,result);)voidadd()(staticintnum=0;num+;result+=num;)add()函數(shù)被調(diào)用了100次,num的值從1一直變到100,這樣就可以求出它們的和了。如果寫成intnum=0;那就是求1+1+1這100個(gè)1的值了。實(shí)
10、際上類似的這類問題我們可以通過遞歸函數(shù)來解決,什么是遞歸,我們下一節(jié)介紹。3 .外部存儲(chǔ)類型外部存儲(chǔ)類型聲明了程序?qū)⒁玫降摹⒌形炊x的外部變量。通常,外部存儲(chǔ)類型都是用于聲明在另一個(gè)轉(zhuǎn)換單元中定義的變量。下面舉一個(gè)例子,這個(gè)例子包括兩個(gè)文件。/*1.C*/voida();main()(externintnum;a();printf(%dn,num);)intnum;voida()(num=5;)這兩個(gè)程序是分別編譯的,然后連接成一個(gè)執(zhí)行文件。具體如何操作,可以查看一些手冊(cè),這兒我簡(jiǎn)單說了一下。把上面兩個(gè)文件都編譯好后,再制作一個(gè)prj文件,里面的內(nèi)容是:1.c2.c只有這兩行,這可在編輯狀
11、態(tài)下寫成,存盤,取名為1.prj。然后選擇project選項(xiàng),選擇projectname,填入1.prj文件名,按F9后,即可生成1.exe文件。main()函數(shù)中變量num是在另一個(gè)文件中定義的。因此,當(dāng)編譯器編譯1.c時(shí),無法確定該變量的地址。這時(shí),外部存儲(chǔ)類型聲明告訴編譯器,把所有對(duì)num的引用當(dāng)作暫且無法確定的引用,等到所有便宜好的目標(biāo)代碼連接成一個(gè)可執(zhí)行程序模塊時(shí),再來處理對(duì)變量num的引用。外部變量的聲明既可以在引用它的函數(shù)的內(nèi)部,也可以在外部。如果變量聲明在函數(shù)外部,那么同一轉(zhuǎn)換單元內(nèi)的所有函數(shù)都可以使用這個(gè)外部變量。反之,如果在函數(shù)內(nèi)部,那么只有這一個(gè)函數(shù)可以使用該變量。前面說
12、了文件作用域的問題,如果在聲明全局變量時(shí),加上static修飾符,那么該變量只在當(dāng)前文件內(nèi)可見,而extern又可以引用其它文件里的變量。所以在一個(gè)大型程序中,每個(gè)程序員只是完成其中的一小塊,為了讓自己的變量不讓其他程序員使用,保持一定的獨(dú)立性,經(jīng)常在全局變量前加static。我們可以這樣來說明一下:還是上面的兩個(gè)文件,現(xiàn)在再增加一個(gè)文件3.c,內(nèi)容為:staticintnum;voida()(num=6;)把1.prj文件后面加上3.c這樣,我們生成的1.exe文件,執(zhí)行時(shí)輸出是5,而不是6。因?yàn)?.c文件的num變量增加了文件作用域,在其他文件中是無法使用它的。4.寄存器存儲(chǔ)類型被聲明為寄存器存儲(chǔ)類型的變量,除了程序無法得到其地址外,其余都和自動(dòng)變量一樣。至于什么是變量地址,以后說指針時(shí)會(huì)詳細(xì)介紹。main()(registerintnum;num=100;printf(%d,num);)使用寄存器存儲(chǔ)類型的目的是讓程序員指定某個(gè)局部變量存放在計(jì)算機(jī)的某個(gè)硬件寄存器里而不是內(nèi)存中,以提高程序的運(yùn)行速度。不過,這只是反映了程序員的主觀意愿,編譯器可以忽略寄存器存儲(chǔ)類型修飾符。寄存器變量的地址是無法取得的,因?yàn)榻^大多數(shù)計(jì)算機(jī)的硬件寄存器都不占用內(nèi)存地址。而且,即使編譯器忽略寄存器類型修飾符把變量放在可設(shè)
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 新人教版七年級(jí)數(shù)學(xué)上冊(cè)1.5.1《乘方》聽評(píng)課記錄1
- 門禁安裝施工方案
- 歷史教研組聽評(píng)課記錄表
- 一年級(jí)語文上聽評(píng)課記錄
- 聽評(píng)課記錄三年級(jí)上
- 語文一年級(jí)聽評(píng)課記錄
- 2025年度智慧醫(yī)療系統(tǒng)分包服務(wù)協(xié)議
- 蘇科版數(shù)學(xué)七年級(jí)上冊(cè)聽評(píng)課記錄《5-1豐富的圖形世界(第1課時(shí))》
- 2025年度建筑行業(yè)綠色施工技術(shù)合同
- 2025年度跨境電子商務(wù)平臺(tái)運(yùn)營管理合同主要內(nèi)容
- 2024-2025學(xué)年深圳市南山區(qū)六年級(jí)數(shù)學(xué)第一學(xué)期期末學(xué)業(yè)水平測(cè)試試題含解析
- 2024-2030年中國免疫細(xì)胞存儲(chǔ)行業(yè)市場(chǎng)發(fā)展分析及競(jìng)爭(zhēng)形勢(shì)與投資戰(zhàn)略研究報(bào)告
- 工貿(mào)行業(yè)企業(yè)安全生產(chǎn)標(biāo)準(zhǔn)化建設(shè)實(shí)施指南
- T-CACM 1560.6-2023 中醫(yī)養(yǎng)生保健服務(wù)(非醫(yī)療)技術(shù)操作規(guī)范穴位貼敷
- 2024年全國統(tǒng)一考試高考新課標(biāo)Ⅱ卷數(shù)學(xué)試題(真題+答案)
- 人教版小學(xué)數(shù)學(xué)一年級(jí)下冊(cè)第1-4單元教材分析
- JTS-215-2018碼頭結(jié)構(gòu)施工規(guī)范
- 財(cái)務(wù)實(shí)習(xí)生合同
- 2024年長沙衛(wèi)生職業(yè)學(xué)院?jiǎn)握新殬I(yè)適應(yīng)性測(cè)試題庫含答案
- 2024山西省文化旅游投資控股集團(tuán)有限公司招聘筆試參考題庫附帶答案詳解
- 地質(zhì)災(zāi)害危險(xiǎn)性評(píng)估的基本知識(shí)
評(píng)論
0/150
提交評(píng)論