函數(shù)中的變量_第1頁
函數(shù)中的變量_第2頁
函數(shù)中的變量_第3頁
函數(shù)中的變量_第4頁
函數(shù)中的變量_第5頁
已閱讀5頁,還剩33頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

第12章函數(shù)中變量在本章學(xué)習(xí)中,要重點(diǎn)掌握以下內(nèi)容:生存期和作用域概念;全局變量和局部變量概念和區(qū)分;變量屏蔽方式;存放變量各個(gè)存放區(qū)作用和區(qū)分;auto變量、static變量、register變量和extern變量使用與區(qū)分。第1頁12.1生存期和作用域C程序中全部變量都有一定生存期和作用域。生存期是指程序運(yùn)行時(shí),變量占有內(nèi)存時(shí)間。變量作用域是指在程序中,變量能夠被使用有效代碼區(qū)域。本節(jié)將討論變量生存期和作用域相關(guān)概念,而且介紹全局變量使用,以及同名變量和變量屏蔽問題。第2頁12.1.1生存期生存期是指程序運(yùn)行時(shí)變量占有內(nèi)存整個(gè)時(shí)期。當(dāng)程序運(yùn)行到變量定義語句時(shí),編譯器為其分配內(nèi)存,這是它生存期開始;當(dāng)變量占用內(nèi)存被釋放時(shí),則標(biāo)志著生存期結(jié)束。第3頁12.1.1生存期第4頁12.1.2作用域作用域是指變量能夠被使用代碼區(qū)域。只有在變量有效作用域內(nèi),變量才是能夠被訪問。在變量作用域之外使用變量是非法操作,編譯器會對這種行為匯報(bào)錯(cuò)誤。變量能夠在main函數(shù)內(nèi)定義,能夠在自定義函數(shù)內(nèi)定義(包含形參),也能夠定義在全部函數(shù)外部,還能夠在各個(gè)函數(shù)內(nèi)部復(fù)合語句中定義。不一樣位置定義變量作用域是不一樣。變量作用域大小由它所在程序塊決定。如前所述,程序塊就是復(fù)合函數(shù),也就是在C語言中使用花括號對({})分隔出來代碼塊。為了便于討論變量作用域,按程序塊間關(guān)系將程序塊分為4類:本層程序塊、上層程序塊、下層程序塊和外部程序塊。分別定義以下。第5頁12.1.2作用域本層程序塊:即程序塊本身。上層程序塊:假如程序塊A放在程序塊B內(nèi)部,那么B為A上層程序塊;同時(shí),B全部上層程序塊也為A上層程序塊。下層程序塊:假如程序塊A內(nèi)部含有B程序塊,那么B為A下層程序塊;同時(shí),B全部下層程序塊都為A下層程序塊。外部程序塊:假如程序塊B不是程序塊A以上三種程序塊任何一個(gè),那么B就是A外部程序塊。第6頁12.2局部變量和全局變量在C語言中,依據(jù)變量作用范圍,能夠?qū)⒆兞糠譃榫植孔兞亢腿肿兞績煞N。兩種變量在使用特點(diǎn)和應(yīng)用中都有很多差異,本章將詳細(xì)講解。第7頁12.2.1局部變量局部變量是指作用域無法涵蓋整個(gè)代碼區(qū)變量。在C語言中,函數(shù)體中定義變量,即函數(shù)內(nèi)部變量也是局部變量之一。需要注意是,因?yàn)榫植孔兞可嫫谠诤瘮?shù)調(diào)用完成后就結(jié)束,所以每次調(diào)用時(shí)局部變量都是新生成、并擁有不一樣內(nèi)存空間變量。像這種只是暫時(shí)有效變量,也稱為“暫時(shí)變量”。作為一個(gè)暫時(shí)變量,局部變量主要優(yōu)點(diǎn)是僅在需要時(shí)編譯器才為之分配內(nèi)存。這是因?yàn)闀簳r(shí)變量僅在程序執(zhí)行到它們被定義程序塊內(nèi)時(shí)才進(jìn)入生存期。第8頁12.2.2全局變量與局部變量相對應(yīng),在全部函數(shù)外部定義變量,即全部函數(shù)外部變量,則被稱為“全局變量”。實(shí)際上,整個(gè)C程序能夠視為一個(gè)程序塊,而且是其余全部程序塊上層程序塊,而全局變量就是在這個(gè)程序塊中定義。所以,全局變量在整個(gè)C程序中都是有效力了,作用域?yàn)閺谋欢x開始直到整個(gè)C程序結(jié)束。比如:第9頁12.2.2全局變量第10頁12.2.3初始化全局變量在C語言中,編譯器對全局變量初始化處理與其余變量不一樣。假如局部變量沒有被顯式地初始化,編譯器不會自動為其清理內(nèi)存;假如全局變量沒有為其顯式初始化,編譯器則會自動初始化,將其內(nèi)存空間去除歸零。內(nèi)存空間清零效果相當(dāng)于:假如變量為int型,則賦值為0;假如變量為float型,則賦值為0.0;假如為int型數(shù)組,則將每一個(gè)數(shù)組元素賦值為0……第11頁12.2.4合理使用全局變量當(dāng)程序需要在不一樣程序塊、不一樣函數(shù)間傳遞數(shù)值信息時(shí),最簡單最有效方式就是使用作用域能夠覆蓋整個(gè)程序全局變量。但與此同時(shí),大作用域也是全局變量一大缺點(diǎn),會造成全局變量一些使用隱患。第12頁12.2.4合理使用全局變量1.過渡使用全局變量會造成資源浪費(fèi)全局變量一旦被定義后,就會在整個(gè)程序執(zhí)行過程中一直占有內(nèi)存空間。而局部變量則只是在一段程序塊中占有內(nèi)存空間。假如毫無顧忌地把全部變量都定義為全局變量,會造成內(nèi)存資源嚴(yán)重浪費(fèi)。因?yàn)椴⒎侨孔兞慷夹枰焉嬷芷诜糯蟮秸麄€(gè)程序執(zhí)行過程,完全能夠把它們定義為局部變量,在需要用到地方才使用,使用結(jié)束后便釋放內(nèi)存。第13頁12.2.4合理使用全局變量2.不宜對全局變量做過多操作因?yàn)槿肿兞磕軌蛟诔绦蛑腥砍绦驂K中訪問,假如訪問該變量操作過多,那么就會給編程和調(diào)試帶來很大難度,因?yàn)槌绦騿T極難確保過多操作全在控制范圍之內(nèi)。對全局變量進(jìn)行過多操作經(jīng)常是一些程序Bug源頭。第14頁12.2.4合理使用全局變量3.不利于模塊化設(shè)計(jì)過多地使用全局變量有悖于模塊化編程思想。模塊化編程基本思想是要將程序劃分為功效單一、相互獨(dú)立多個(gè)模塊,而過多使用全局變量必定會使不一樣模塊操作同一變量,加強(qiáng)了模塊間耦合度,使模塊間經(jīng)過一些變量相互影響,減弱了模塊功效獨(dú)立性。第15頁12.2.4合理使用全局變量4.破壞信息封裝性一些只需定義為局部變量變量假如被提升為全局變量,不但僅浪費(fèi)了內(nèi)存,而且還破壞了模塊信息封裝性。在模塊化編程過程中,劃分模塊時(shí),不但要使各個(gè)模塊功效單一,還要使模塊間相互獨(dú)立,同時(shí)對信息進(jìn)行有效封裝。信息封裝意思就是假如只需在模塊內(nèi)處理信息,應(yīng)該只放在模塊內(nèi),外部不應(yīng)該看到除模塊接口(比如函數(shù)申明)之外全部模塊信息。第16頁12.2.5同名變量和變量屏蔽當(dāng)互為外部程序塊多個(gè)程序塊內(nèi)存在同名變量時(shí),因?yàn)槿客獠砍绦驂K變量在本層程序塊中都是無效,能夠工作只有本層程序塊定義變量,那么訪問該名字變量,使用只能是本層定義變量。這種情況下同名變量不會造成命名沖突。因?yàn)楹瘮?shù)之間互為外部程序塊,一個(gè)函數(shù)變量在另一個(gè)函數(shù)中必定是無效,所以當(dāng)存在同名變量時(shí),函數(shù)訪問必定是本函數(shù)定義變量。第17頁12.3變量存放類別C語言中變量都有兩個(gè)屬性:數(shù)據(jù)類型和存放類別。數(shù)據(jù)類型在第2章已經(jīng)詳細(xì)討論過,本節(jié)將討論變量存放類別。C語言中定義了4個(gè)關(guān)鍵字作為變量存放類別修飾詞,分別為:auto、static、register和extern。變量存放類別決定了變量在內(nèi)存中存放區(qū)域。本節(jié)首先將介紹C語言中內(nèi)存存放區(qū)劃分以及各個(gè)存放區(qū)概念,接著將介紹各種存放類別變量概念和使用。第18頁12.3.1內(nèi)存存放區(qū)在C語言中,內(nèi)存存放區(qū)能夠分為4種不一樣存放區(qū):棧、堆、靜止存放區(qū)和常量存放區(qū)。1.棧棧是由編譯器管理動態(tài)存放區(qū)域,用于存放暫時(shí)變量,即只在需要時(shí)才被分配內(nèi)存,不需要時(shí)編譯器會自動回收。可存放數(shù)據(jù)包含以下幾項(xiàng)。函數(shù)形參:其只在函數(shù)執(zhí)行期內(nèi)有效。局部變量(不包含static修飾局部變量):只在它定義程序塊及其下層程序塊執(zhí)行期內(nèi)有效。其它暫時(shí)變量(比如,a++語句中產(chǎn)生暫時(shí)變量):函數(shù)返回時(shí)產(chǎn)生暫時(shí)變量。第19頁12.3.1內(nèi)存存放區(qū)2.堆堆是由程序管理動態(tài)存放區(qū)域,用于分配由程序使用malloc函數(shù)申請內(nèi)存空間,需要由程序自行釋放。在內(nèi)存管理一章中將討論這塊存放區(qū)域使用。堆上分配內(nèi)存也是未經(jīng)初始化,需要程序顯式地初始化。第20頁12.3.1內(nèi)存存放區(qū)3.靜態(tài)存放區(qū)靜態(tài)存放區(qū)用于存放全局變量,該區(qū)域內(nèi)存在程序開始時(shí)就已固定分配完成,直到程序結(jié)束由編譯器自動釋放,在該區(qū)域分配內(nèi)存在整個(gè)程序執(zhí)行過程中都是有效。全局變量全部存放在靜態(tài)存放區(qū)中。靜態(tài)存放區(qū)內(nèi)存分配時(shí)由編譯器自動初始化。第21頁12.3.1內(nèi)存存放區(qū)4.常量存放區(qū)常量存放區(qū)用于存放程序中常量,同時(shí)經(jīng)編譯器優(yōu)化后const常量也可能占用該區(qū)域內(nèi)存。第22頁12.3.2auto變量存放類別auto作用是申明變量生存期為自動型,auto變量內(nèi)存由編譯器自動從棧上分配,所以auto變量都是暫時(shí)變量。使用auto申明變量形式十分簡單,以下所表示。auto數(shù)據(jù)類型變量名;或數(shù)據(jù)類型auto變量名:第23頁12.3.2auto變量假如變量還有const和volatile修飾詞,它們擺放次序能夠相互任意調(diào)換,只要確保這些修飾詞都在變量名之前即可。下面是一些auto變量申明實(shí)例。constautointamount=1;autovolatilefloatrpg=0;intconstautobb=2;這個(gè)申明次序規(guī)則對于后面介紹存放類別static、register和extern都適用,后面不再贅述。第24頁12.3.2auto變量全部局部變量申明中假如不含存放類別,那么都默認(rèn)為auto型變量。以下函數(shù)中兩種申明方式是等效。/*申明方式1*/intfun(autointarg1,autodoublearg2){autointa=1;autointb=1;……}/*申明方式1*/intfun(intarg1,doublearg2){inta=1;intb=1;……}第25頁12.3.3static局部變量儲存類型static作用是將變量申明為static型,即靜止型,該類別變量內(nèi)存均從靜止存放區(qū)分配,生存期為整個(gè)程序執(zhí)行過程。static使用形式也非常簡單,形式以下:static數(shù)據(jù)類型名變量名;static能夠修飾局部變量,也能夠修飾全局變量。本節(jié)先討論static局部變量使用。第26頁12.3.3static局部變量因?yàn)楹瘮?shù)內(nèi)auto局部變量每次函數(shù)結(jié)束后都會被釋放,所以不能將此次函數(shù)調(diào)用信息保留。不過,當(dāng)函數(shù)功效需要在屢次調(diào)用中傳遞信息時(shí),就需要一個(gè)變量能在函數(shù)結(jié)束時(shí)保留住內(nèi)存而不釋放,這時(shí)就需要使用static局部變量。比如:01 voidfunc(void){02 staticinta=2;03 ++a;04 }第27頁12.3.3static局部變量該函數(shù)中a為static局部變量,第2行定義語句只會在第一次調(diào)用時(shí)執(zhí)行,在后面函數(shù)調(diào)用中該語句相當(dāng)于空語句。變量a存放在靜止存放區(qū),其生存期包含了程序整個(gè)執(zhí)行過程,在每次函數(shù)結(jié)束時(shí),其內(nèi)存不會被釋放。下一次調(diào)用該函數(shù)時(shí),a值等于上一次函數(shù)結(jié)束時(shí)值。比如,有以下調(diào)用語句:01 func();02 func();03 func();上述語句執(zhí)行過程中,變量a改變右表所表示。第28頁

12.3.4register變量全部變量值都是存放在內(nèi)存中,而計(jì)算機(jī)直接操作對象是存放器。存放器是CPU內(nèi)部元件,存放器擁有非常高讀寫速度,所以在存放器之間數(shù)據(jù)傳送非常快。當(dāng)程序訪問變量時(shí),計(jì)算機(jī)要先從內(nèi)存中將變量值提取到存放器中。;運(yùn)算結(jié)束后,假如該變量值發(fā)生改變,則還需要把存放器中值重新送回到內(nèi)存存放。第29頁

12.3.4register變量C語言中提供了一個(gè)存放類別register,這種存放類別變量值會被要求直接存放在存放器中。訪問該變量無需從內(nèi)存中獲取它值,存放該變量時(shí)也無需再存回內(nèi)存,都直接在存放器上進(jìn)行操作。因?yàn)榇娣牌鞔嫒∷俣纫h(yuǎn)快于內(nèi)存存取數(shù)度,所以,假如一個(gè)該變量在程序中被頻繁使用,那么將其申明為register變量,將大大提升程序執(zhí)行效率。register型變量申明以下所表示。register數(shù)據(jù)類型名變量名;第30頁

12.3.4register變量register變量使用要注意以下幾點(diǎn)。register只能修飾函數(shù)內(nèi)變量,包含局部變量和形式參數(shù)。比如:voidfunction(registerintx,registerinty){registerinta=1;}第31頁

12.3.4register變量一個(gè)變量只能申明為一個(gè)存放類別。以下3個(gè)變量申明是錯(cuò)誤。voidfunction(void){registerstaticinta; /*函數(shù)內(nèi)變量申明*/registerautointb; /*函數(shù)內(nèi)變量申明*/}registerintc; /*函數(shù)外變量申明*/以上三個(gè)申明都將變量同時(shí)申明為兩種存放類別。其中,函數(shù)外變量本身就是全局變量。第32頁

12.3.4register變量不能對register變量進(jìn)行取地址操作。以下兩種使用方法都是錯(cuò)誤。registerinta;scanf(“%d”,&a);printf(“%x”,&a);申明為register變量未必都會存放在存放器內(nèi),該申明作用只是要求把該變量放在存放器中處理。因?yàn)榇娣牌鲾?shù)量是有限,同時(shí)還因?yàn)楦鱾€(gè)系統(tǒng)允許使用存放器也不一樣,有系統(tǒng)只允許部分類型變量能夠存放在存放器中。注意:若函數(shù)參數(shù)在函數(shù)中被操作次數(shù)超出3次,便能夠考慮將其申明為register變量。第33頁12.3.5extern變量關(guān)鍵字extern用于申明全局變量時(shí),能夠擴(kuò)展全局變量作用域。在12.3.2節(jié)中已介紹了該關(guān)鍵字使用形式,并討論了若要在變量定義前使用變量時(shí),能夠借助extern來進(jìn)行申明。在這種情況下,extern作用是在一個(gè)文件中擴(kuò)展了全局變量作用域。除此之外,extern還能夠使全局變量作用域擴(kuò)展到其它文件中。第34頁12.3

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論