![存儲類別和作用域_第1頁](http://file4.renrendoc.com/view/0dfa26ec5e0d0020f65006a62297b79b/0dfa26ec5e0d0020f65006a62297b79b1.gif)
![存儲類別和作用域_第2頁](http://file4.renrendoc.com/view/0dfa26ec5e0d0020f65006a62297b79b/0dfa26ec5e0d0020f65006a62297b79b2.gif)
![存儲類別和作用域_第3頁](http://file4.renrendoc.com/view/0dfa26ec5e0d0020f65006a62297b79b/0dfa26ec5e0d0020f65006a62297b79b3.gif)
![存儲類別和作用域_第4頁](http://file4.renrendoc.com/view/0dfa26ec5e0d0020f65006a62297b79b/0dfa26ec5e0d0020f65006a62297b79b4.gif)
![存儲類別和作用域_第5頁](http://file4.renrendoc.com/view/0dfa26ec5e0d0020f65006a62297b79b/0dfa26ec5e0d0020f65006a62297b79b5.gif)
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
存儲類別和作用域第一頁,共三十二頁,編輯于2023年,星期日4.6存儲類別和作用域變量的作用域:是指變量在程序中有效的空間范圍,變量的作用域與定義變量的位置有關(guān);變量的生存期:指的是變量生成到變量空間釋放的時間范圍,變量的生存期與變量的存儲類別相關(guān)。
C++可將作用域分為五種:塊作用域、文件作用域、函數(shù)原型作用域、函數(shù)作用域和類作用域。第二頁,共三十二頁,編輯于2023年,星期日1.塊作用域塊:就是用花括號括起來的那部分程序。在塊內(nèi)說明的標識符只能在該塊內(nèi)引用,即其作用域在塊內(nèi)。所有函數(shù)體內(nèi)定義的變量都具有塊作用域。在一個函數(shù)內(nèi)或塊內(nèi)定義的變量被稱為局部變量;對于塊中嵌套其他塊的情況,如果嵌套塊中有同名局部變量,服從局部優(yōu)先原則,即在內(nèi)層塊中屏蔽外層塊中的同名變量。在函數(shù)原型作用域和函數(shù)作用域內(nèi)定義的變量都屬于局部變量;第三頁,共三十二頁,編輯于2023年,星期日【例4.12】局部變量的屏蔽。#include<iostream.h>voidmain(){ inti=5; { cout<<"i1="<<i<<'\n'; //A inti; i=7; cout<<"i2="<<i<<'\n'; //B } cout<<"i3="<<i<<'\n'; //C return;}運行結(jié)果是:i1=5i2=7i3=5第四頁,共三十二頁,編輯于2023年,星期日2.文件作用域在所有函數(shù)外定義的變量稱為全局變量,全局變量的作用域稱為文件的作用域;當(dāng)局部變量與全局變量同名時,局部變量(塊作用域內(nèi)的變量)優(yōu)先。它與塊作用域不同的是:在塊作用域內(nèi)可通過域運算符“::”來引用與局部變量同名的全局變量。第五頁,共三十二頁,編輯于2023年,星期日【例4.13】在塊作用域內(nèi)引用文件作用域中的同名全局變量。#include<iostream.h>inti=0; //Avoidmain(){ inti=5; //B { cout<<i; //C inti=7; //D cout<<i;//E cout<<::i;//F }}程序運行后結(jié)果為:570第六頁,共三十二頁,編輯于2023年,星期日4.6.2變量的存儲類別操作系統(tǒng)為一個C++程序的運行所分配的內(nèi)存分為4個區(qū)域,如圖4.2所示。代碼區(qū):存放程序代碼,即程序中各個函數(shù)的代碼塊靜態(tài)數(shù)據(jù)區(qū):存放程序的全局數(shù)據(jù)和靜態(tài)數(shù)據(jù)棧區(qū):存放程序中的局部變量,如函數(shù)中的局部變量等堆區(qū):存放動態(tài)分配的數(shù)據(jù)。堆區(qū)(動態(tài)數(shù)據(jù))棧區(qū)(函數(shù)局部數(shù)據(jù))main()函數(shù)局部數(shù)據(jù)靜態(tài)數(shù)據(jù)區(qū)(全局變量、靜態(tài)變量)代碼區(qū)(程序代碼)圖4.2程序在內(nèi)存中的區(qū)域第七頁,共三十二頁,編輯于2023年,星期日C++使用四種說明符auto(自動類型)、register(寄存器類型)、static(靜態(tài)類型)和extern(外部類型)來確定變量的存儲類型。加上變量的作用域的不同,在C++中變量共有下列5種存儲形式:局部變量、全局變量、外部變量、靜態(tài)變量、寄存器變量;第八頁,共三十二頁,編輯于2023年,星期日
在函數(shù)或塊內(nèi)部說明的變量稱為局部變量(如形參變量),由于建立和撤消這些變量是由系統(tǒng)自動完成,因此這類變量又稱為自動型變量。注意:a:局部變量僅由說明它的函數(shù)或塊的內(nèi)部語句所訪問;換言之,局部變量在定義自己的函數(shù)或塊之外是不可見的。b:局部變量在進入函數(shù)時生成,退出時消亡。因此局部變量的生存期僅存在于被定義的函數(shù)或塊中。1、自動存儲變量(局部變量,屬于auto型)第九頁,共三十二頁,編輯于2023年,星期日#include<iostream.h>voidfunc1();voidfunc2();voidfunc1(){ intx; x=10; cout<<x<<‘\t’;}voidmain(void){ intx=20; func1(); func2(); cout<<x;}voidfunc2(){ intx; x=-199; cout<<x<<‘\t’;}第十頁,共三十二頁,編輯于2023年,星期日程序說明:整形變量x被說明了3次,一次在func1中,另一次在func2和main中,func1和func2中的x互不相關(guān),也就是說,局部變量的值不能在兩次調(diào)用之間保持。在C語言中,必須在函數(shù)或語句塊的開頭先于其它任何語句說明所有的局部變量。但在C++中,只需在變量使用之前說明就可以了。(結(jié)果為:10-19920)第十一頁,共三十二頁,編輯于2023年,星期日
與局部變量不同,全局變量在任何函數(shù)之外說明,包括main函數(shù),并且可被任何一個函數(shù)使用。全局變量將在整個程序運行期間保持有效,同時可被函數(shù)內(nèi)的任何表達式訪問。說明全局變量的最佳位置在程序的一開始。2、全局變量第十二頁,共三十二頁,編輯于2023年,星期日#include<iostream.h>intcount;voidfunc1();voidfunc2();voidfunc1(){inttemp;temp=count;func2();cout<<“countis:”<<temp;}voidmain(void){count=100;func1();exit(0);}voidfunc2(){intcount;for(count=1;count<10;count++)cout.put(‘?!?;}第十三頁,共三十二頁,編輯于2023年,星期日
全局變量count既不在main()中說明,也不在func1()中說明,但可以在兩者中被訪問。函數(shù)func2中也說明了一個同名的局部變量count,但func2訪問count時,僅訪問自己說明的局部變量count,而不是那個全局變量count。注意:全局變量和某一函數(shù)的局部變量同名時,在函數(shù)內(nèi)對該名的訪問權(quán)僅針對局部變量,對全局變量無任何影響。程序執(zhí)行結(jié)果為:。。。。。。。。。countis100//9個“?!背绦蚍治觯旱谑捻?,共三十二頁,編輯于2023年,星期日使用全局變量應(yīng)注意的幾點:不論是否需要,全局變量在整個程序執(zhí)行期間均占用固定的內(nèi)存空間。在使用局部變量就可以達到其功能時,應(yīng)避免使用全局變量,這樣可以提高函數(shù)的通用性。大量使用全局變量時,可能導(dǎo)致不期望的副作用。例如,變量值在程序其它地點的偶然改變,將在程序的整個生存期內(nèi)有效。第十五頁,共三十二頁,編輯于2023年,星期日
由于C++語言支持分離編譯,既一個完整的C++語言程序可以由多個獨立的文件組成,每個文件可以分別單獨編譯,然后再由鏈接程序完成程序組裝。因此必須將程序需要的所有全局變量通過某種方法告訴所有的獨立文件。方法就是在一個文件中說明所有全局變量,在其它文件中用extern再次描述它們。因此外部變量定義是:由extern說明的全局變量稱為外部變量。3、外部變量第十六頁,共三十二頁,編輯于2023年,星期日文件1intx,y;charch;Voidmain(void){...........}文件2externintx,y;externcharch;voidfunc22(){x=y/10;}voidfunc1(){x=123;}voidfunc23(){y=10;}程序分析:在文件2中,全局變量表是從文件1中復(fù)制過來的,并將分類符extern加在說明之前。extern告訴編譯程序,如下變量的類型和名字已在別處說明過了。第十七頁,共三十二頁,編輯于2023年,星期日穩(wěn)定的具有固定的內(nèi)存地址的變量稱為靜態(tài)變量;
(
或:用static修飾的變量);
靜態(tài)變量不象動態(tài)變量是在程序執(zhí)行過程中被動態(tài)建立、動態(tài)撤消的。靜態(tài)變量的定義格式為:static變量類型變量列表;靜態(tài)變量又可分為靜態(tài)局部變量和靜態(tài)全局變量。靜態(tài)局部變量:是指定義在模塊內(nèi)部的靜態(tài)變量。它與局部變量的共同點是:都是局限于某個模塊內(nèi)部;僅在該模塊內(nèi)是有效的;4、靜態(tài)變量第十八頁,共三十二頁,編輯于2023年,星期日
局部變量僅存在于該模塊被調(diào)用時,函數(shù)退出后,該變量就消失了。因此,它沒有連續(xù)性,在末賦初值時,其值不定;而靜態(tài)局部變量是始終存在的,即使退出該模塊,變量仍然有效。這是因為它在內(nèi)存中占有固定的單元,在多次調(diào)用該模塊時,可以保持此變量的連續(xù)性。它們的不同點是:第十九頁,共三十二頁,編輯于2023年,星期日#include<iostream.h>voidabc(intx,inty,intz);voidmain(void){ inti,j,k; i=5;j=10; for(k=1;k<=5;k++) abc(i,j,k);}voidabc(intx,inty,intz){ intm; staticintn; if(z==1) {m=0;n=0;} else { m+=x+y; n+=x+y; } cout<<"m="<<m<<",n="<<n<<'\n';}例:說明靜態(tài)局部變量與局部變量的區(qū)別;第二十頁,共三十二頁,編輯于2023年,星期日在上例中,函數(shù)abc()中的if語句if(z==0) {m=0;n=0;}是為了同時給m,n賦值。然而多次調(diào)用函數(shù)abc(),n的初值在起作用,保持了連續(xù)性。而m初值沒有起作用,沒有連續(xù)性。語句m+=x+y;在z!=1以后的多次調(diào)用中,結(jié)果為不確定(因為沒有被賦值)。程序運行結(jié)果: m=0,n=0; m=*,n=15 m=*,n=30; m=*,n=45; m=*,n=60;其中*表示不確定值。程序說明:第二十一頁,共三十二頁,編輯于2023年,星期日
用static修飾全局變量稱為靜態(tài)全局變量。靜態(tài)全局變量與全局變量在形式上類似,但意義不同。靜態(tài)全局變量只在它被定義的源文件中是有效的(該文件可以有幾個函數(shù)),而在任何別的源文件中則是無效的。而全局變量通過extern修飾后可以作用于一個程序的多個源文件中。靜態(tài)全局變量:第二十二頁,共三十二頁,編輯于2023年,星期日例:文件1staticinti=5;intj=10;voidmain(void){ intk1,k2; k1=f1(i,j); k2=f2(i,j); cout<<"k1="<<k1<<",k2="<<k2<<endl;}f1(intx,inty){ intz; z=x+y+i; return(z);}文件2externintj;f2(inta,intb){ intc; c=a*b+j; return(c);}運行結(jié)果:k1=20,k2=60;第二十三頁,共三十二頁,編輯于2023年,星期日程序說明:這個程序有三個函數(shù):main,f1,f2。其中函數(shù)f2單獨作為一個文件,main和f1為另一個文件。程序中用一個靜態(tài)全局變量i和一個全局變量j。因此變量j既可以在文件1中使用,也可以在文件2中通過extern說明使用。然而,變量i是靜態(tài)全局變量,它只能在文件1中使用,即在函數(shù)main和函數(shù)f1中使用。第二十四頁,共三十二頁,編輯于2023年,星期日C++語言提供了一種僅用于int和char類型變量的存儲分類符register,(因為通常寄存器是16位或32位字長)。它的定義是:用register修飾的局部變量稱為寄存器變量。幾點注意:分類符register要求編譯系統(tǒng)將它所說明的變量值保存在CPU寄存器中,而不是象普通變量那樣存放在內(nèi)存單元中,此時由于對變量的存取不必訪問內(nèi)存,因此運算速度大大快于普通變量的運算。這一類變量常用于循環(huán)控制部分;分類符register僅可用于局部變量和函數(shù)的形式參數(shù),因為這些變量都是缺省的自動變量。全局的register變量是不允許的;5、寄存器變量第二十五頁,共三十二頁,編輯于2023年,星期日因為register變量存放在CPU的寄存器中,所以它沒有地址,也就是說,不能用地址操作符&對register變量進行地址操作;一個函數(shù)中所允許的寄存器變量的數(shù)目取決于處理器類型以及所指定的C++編譯系統(tǒng)。若程序中寄存器變量的數(shù)量超過極限時,編譯系統(tǒng)可能自動將它們轉(zhuǎn)換成自動變量,從而保證了程序的可移植性;第二十六頁,共三十二頁,編輯于2023年,星期日int_pwr(intm,registerinte){ registerinttemp; temp=1; for(;e;e--) temp=temp*m; return(temp);}程序說明:其中e和temp因用在循環(huán)中而又都說明為register變量,由于register變量可以提高速度,因此它是最理想的循環(huán)控制變量。例:求M的e次冪。第二十七頁,共三十二頁,編輯于2023年,星期日最后總結(jié):全局變量和靜態(tài)變量只在程序的開始一次生成;局部變量和寄存器變量在進入定義它們的程序塊和每個入口多次生成;沒有賦值的局部變量和寄存器變量在第一個賦值語句之前是末知的。例1:不同存儲類變量的應(yīng)用;例2:自動類與局部靜態(tài)類變量的應(yīng)用;例3:由多個文件組成的程序中變量的作用域;第二十八頁,共三十二頁,編輯于2023年,星期日#include<iostream.h>#include<iomanip.h>inti=1;voidother(void);voidmain(void){ staticinta; registerintb=-10; intc=0; cout<<"i: "<<"a: "<<"b: "<<"c: "<<endl; cout<<i<<setw(8)<<a<<setw(8)<<b<<setw(8)<<c<<endl;//例:不同存儲類型變量的應(yīng)用 c+=8; other(); cout<<i<<setw(8)<<a<<setw(8)<<b<<setw(8)<<c<<endl; i+=10; other();}voidother(void){ staticinta=2; staticintb; intc=10; a+=2; i+=32; c+=5; cout<<i<<setw(8)<<a<<setw(8)<<b<<setw(8)<<c<<endl; b=a;}
溫馨提示
- 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024年12月山西忻州市岢嵐經(jīng)濟技術(shù)開發(fā)區(qū)管理委員會市場化選聘開發(fā)區(qū)高級管理人員1人筆試歷年典型考題(歷年真題考點)解題思路附帶答案詳解
- 生物制品股權(quán)合作居間合同
- 教育信息平臺項目開發(fā)合同
- 農(nóng)業(yè)科技園區(qū)建設(shè)項目合同
- 建筑施工工程總承包合同
- 物業(yè)管理行業(yè)物業(yè)服務(wù)合同
- 鋼結(jié)構(gòu)班組承包合同
- 跨國金融項目資金運作合同
- 大規(guī)模電子商務(wù)運營合同
- 幼兒園保育員聘用合同協(xié)議
- 2025版茅臺酒出口業(yè)務(wù)代理及銷售合同模板4篇
- 2025年人教版數(shù)學(xué)五年級下冊教學(xué)計劃(含進度表)
- 北師大版七年級上冊數(shù)學(xué)期末考試試題及答案
- 初中信息技術(shù)課堂中的項目式學(xué)習(xí)實踐研究結(jié)題報告
- 2024安全事故案例
- 2024-2025學(xué)年人教版數(shù)學(xué)六年級上冊 期末綜合卷(含答案)
- 天津市部分區(qū)2023-2024學(xué)年高二上學(xué)期期末考試 物理 含解析
- 2024年考研管理類綜合能力(199)真題及解析完整版
- 2025年初級社會工作者綜合能力全國考試題庫(含答案)
- 2024年濰坊護理職業(yè)學(xué)院單招職業(yè)適應(yīng)性測試題庫附答案
- 《鉗工基本知識》課件
評論
0/150
提交評論