版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
存儲(chǔ)類別和作用域第1頁,共32頁,2023年,2月20日,星期一4.6存儲(chǔ)類別和作用域變量的作用域:是指變量在程序中有效的空間范圍,變量的作用域與定義變量的位置有關(guān);變量的生存期:指的是變量生成到變量空間釋放的時(shí)間范圍,變量的生存期與變量的存儲(chǔ)類別相關(guān)。
C++可將作用域分為五種:塊作用域、文件作用域、函數(shù)原型作用域、函數(shù)作用域和類作用域。第2頁,共32頁,2023年,2月20日,星期一1.塊作用域塊:就是用花括號(hào)括起來的那部分程序。在塊內(nèi)說明的標(biāo)識(shí)符只能在該塊內(nèi)引用,即其作用域在塊內(nèi)。所有函數(shù)體內(nèi)定義的變量都具有塊作用域。在一個(gè)函數(shù)內(nèi)或塊內(nèi)定義的變量被稱為局部變量;對于塊中嵌套其他塊的情況,如果嵌套塊中有同名局部變量,服從局部優(yōu)先原則,即在內(nèi)層塊中屏蔽外層塊中的同名變量。在函數(shù)原型作用域和函數(shù)作用域內(nèi)定義的變量都屬于局部變量;第3頁,共32頁,2023年,2月20日,星期一【例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;}運(yùn)行結(jié)果是:i1=5i2=7i3=5第4頁,共32頁,2023年,2月20日,星期一2.文件作用域在所有函數(shù)外定義的變量稱為全局變量,全局變量的作用域稱為文件的作用域;當(dāng)局部變量與全局變量同名時(shí),局部變量(塊作用域內(nèi)的變量)優(yōu)先。它與塊作用域不同的是:在塊作用域內(nèi)可通過域運(yùn)算符“::”來引用與局部變量同名的全局變量。第5頁,共32頁,2023年,2月20日,星期一【例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 }}程序運(yùn)行后結(jié)果為:570第6頁,共32頁,2023年,2月20日,星期一4.6.2變量的存儲(chǔ)類別操作系統(tǒng)為一個(gè)C++程序的運(yùn)行所分配的內(nèi)存分為4個(gè)區(qū)域,如圖4.2所示。代碼區(qū):存放程序代碼,即程序中各個(gè)函數(shù)的代碼塊靜態(tài)數(shù)據(jù)區(qū):存放程序的全局?jǐn)?shù)據(jù)和靜態(tài)數(shù)據(jù)棧區(qū):存放程序中的局部變量,如函數(shù)中的局部變量等堆區(qū):存放動(dòng)態(tài)分配的數(shù)據(jù)。堆區(qū)(動(dòng)態(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ū)域第7頁,共32頁,2023年,2月20日,星期一C++使用四種說明符auto(自動(dòng)類型)、register(寄存器類型)、static(靜態(tài)類型)和extern(外部類型)來確定變量的存儲(chǔ)類型。加上變量的作用域的不同,在C++中變量共有下列5種存儲(chǔ)形式:局部變量、全局變量、外部變量、靜態(tài)變量、寄存器變量;第8頁,共32頁,2023年,2月20日,星期一
在函數(shù)或塊內(nèi)部說明的變量稱為局部變量(如形參變量),由于建立和撤消這些變量是由系統(tǒng)自動(dòng)完成,因此這類變量又稱為自動(dòng)型變量。注意:a:局部變量僅由說明它的函數(shù)或塊的內(nèi)部語句所訪問;換言之,局部變量在定義自己的函數(shù)或塊之外是不可見的。b:局部變量在進(jìn)入函數(shù)時(shí)生成,退出時(shí)消亡。因此局部變量的生存期僅存在于被定義的函數(shù)或塊中。1、自動(dòng)存儲(chǔ)變量(局部變量,屬于auto型)第9頁,共32頁,2023年,2月20日,星期一#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’;}第10頁,共32頁,2023年,2月20日,星期一程序說明:整形變量x被說明了3次,一次在func1中,另一次在func2和main中,func1和func2中的x互不相關(guān),也就是說,局部變量的值不能在兩次調(diào)用之間保持。在C語言中,必須在函數(shù)或語句塊的開頭先于其它任何語句說明所有的局部變量。但在C++中,只需在變量使用之前說明就可以了。(結(jié)果為:10-19920)第11頁,共32頁,2023年,2月20日,星期一
與局部變量不同,全局變量在任何函數(shù)之外說明,包括main函數(shù),并且可被任何一個(gè)函數(shù)使用。全局變量將在整個(gè)程序運(yùn)行期間保持有效,同時(shí)可被函數(shù)內(nèi)的任何表達(dá)式訪問。說明全局變量的最佳位置在程序的一開始。2、全局變量第12頁,共32頁,2023年,2月20日,星期一#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(‘?!?;}第13頁,共32頁,2023年,2月20日,星期一
全局變量count既不在main()中說明,也不在func1()中說明,但可以在兩者中被訪問。函數(shù)func2中也說明了一個(gè)同名的局部變量count,但func2訪問count時(shí),僅訪問自己說明的局部變量count,而不是那個(gè)全局變量count。注意:全局變量和某一函數(shù)的局部變量同名時(shí),在函數(shù)內(nèi)對該名的訪問權(quán)僅針對局部變量,對全局變量無任何影響。程序執(zhí)行結(jié)果為:。。。。。。。。。countis100//9個(gè)“?!背绦蚍治觯旱?4頁,共32頁,2023年,2月20日,星期一使用全局變量應(yīng)注意的幾點(diǎn):不論是否需要,全局變量在整個(gè)程序執(zhí)行期間均占用固定的內(nèi)存空間。在使用局部變量就可以達(dá)到其功能時(shí),應(yīng)避免使用全局變量,這樣可以提高函數(shù)的通用性。大量使用全局變量時(shí),可能導(dǎo)致不期望的副作用。例如,變量值在程序其它地點(diǎn)的偶然改變,將在程序的整個(gè)生存期內(nèi)有效。第15頁,共32頁,2023年,2月20日,星期一
由于C++語言支持分離編譯,既一個(gè)完整的C++語言程序可以由多個(gè)獨(dú)立的文件組成,每個(gè)文件可以分別單獨(dú)編譯,然后再由鏈接程序完成程序組裝。因此必須將程序需要的所有全局變量通過某種方法告訴所有的獨(dú)立文件。方法就是在一個(gè)文件中說明所有全局變量,在其它文件中用extern再次描述它們。因此外部變量定義是:由extern說明的全局變量稱為外部變量。3、外部變量第16頁,共32頁,2023年,2月20日,星期一文件1intx,y;charch;Voidmain(void){...........}文件2externintx,y;externcharch;voidfunc22(){x=y/10;}voidfunc1(){x=123;}voidfunc23(){y=10;}程序分析:在文件2中,全局變量表是從文件1中復(fù)制過來的,并將分類符extern加在說明之前。extern告訴編譯程序,如下變量的類型和名字已在別處說明過了。第17頁,共32頁,2023年,2月20日,星期一穩(wěn)定的具有固定的內(nèi)存地址的變量稱為靜態(tài)變量;
(
或:用static修飾的變量);
靜態(tài)變量不象動(dòng)態(tài)變量是在程序執(zhí)行過程中被動(dòng)態(tài)建立、動(dòng)態(tài)撤消的。靜態(tài)變量的定義格式為:static變量類型變量列表;靜態(tài)變量又可分為靜態(tài)局部變量和靜態(tài)全局變量。靜態(tài)局部變量:是指定義在模塊內(nèi)部的靜態(tài)變量。它與局部變量的共同點(diǎn)是:都是局限于某個(gè)模塊內(nèi)部;僅在該模塊內(nèi)是有效的;4、靜態(tài)變量第18頁,共32頁,2023年,2月20日,星期一
局部變量僅存在于該模塊被調(diào)用時(shí),函數(shù)退出后,該變量就消失了。因此,它沒有連續(xù)性,在末賦初值時(shí),其值不定;而靜態(tài)局部變量是始終存在的,即使退出該模塊,變量仍然有效。這是因?yàn)樗趦?nèi)存中占有固定的單元,在多次調(diào)用該模塊時(shí),可以保持此變量的連續(xù)性。它們的不同點(diǎn)是:第19頁,共32頁,2023年,2月20日,星期一#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ū)別;第20頁,共32頁,2023年,2月20日,星期一在上例中,函數(shù)abc()中的if語句if(z==0) {m=0;n=0;}是為了同時(shí)給m,n賦值。然而多次調(diào)用函數(shù)abc(),n的初值在起作用,保持了連續(xù)性。而m初值沒有起作用,沒有連續(xù)性。語句m+=x+y;在z!=1以后的多次調(diào)用中,結(jié)果為不確定(因?yàn)闆]有被賦值)。程序運(yùn)行結(jié)果: m=0,n=0; m=*,n=15 m=*,n=30; m=*,n=45; m=*,n=60;其中*表示不確定值。程序說明:第21頁,共32頁,2023年,2月20日,星期一
用static修飾全局變量稱為靜態(tài)全局變量。靜態(tài)全局變量與全局變量在形式上類似,但意義不同。靜態(tài)全局變量只在它被定義的源文件中是有效的(該文件可以有幾個(gè)函數(shù)),而在任何別的源文件中則是無效的。而全局變量通過extern修飾后可以作用于一個(gè)程序的多個(gè)源文件中。靜態(tài)全局變量:第22頁,共32頁,2023年,2月20日,星期一例:文件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);}運(yùn)行結(jié)果:k1=20,k2=60;第23頁,共32頁,2023年,2月20日,星期一程序說明:這個(gè)程序有三個(gè)函數(shù):main,f1,f2。其中函數(shù)f2單獨(dú)作為一個(gè)文件,main和f1為另一個(gè)文件。程序中用一個(gè)靜態(tài)全局變量i和一個(gè)全局變量j。因此變量j既可以在文件1中使用,也可以在文件2中通過extern說明使用。然而,變量i是靜態(tài)全局變量,它只能在文件1中使用,即在函數(shù)main和函數(shù)f1中使用。第24頁,共32頁,2023年,2月20日,星期一C++語言提供了一種僅用于int和char類型變量的存儲(chǔ)分類符register,(因?yàn)橥ǔ<拇嫫魇?6位或32位字長)。它的定義是:用register修飾的局部變量稱為寄存器變量。幾點(diǎn)注意:分類符register要求編譯系統(tǒng)將它所說明的變量值保存在CPU寄存器中,而不是象普通變量那樣存放在內(nèi)存單元中,此時(shí)由于對變量的存取不必訪問內(nèi)存,因此運(yùn)算速度大大快于普通變量的運(yùn)算。這一類變量常用于循環(huán)控制部分;分類符register僅可用于局部變量和函數(shù)的形式參數(shù),因?yàn)檫@些變量都是缺省的自動(dòng)變量。全局的register變量是不允許的;5、寄存器變量第25頁,共32頁,2023年,2月20日,星期一因?yàn)閞egister變量存放在CPU的寄存器中,所以它沒有地址,也就是說,不能用地址操作符&對register變量進(jìn)行地址操作;一個(gè)函數(shù)中所允許的寄存器變量的數(shù)目取決于處理器類型以及所指定的C++編譯系統(tǒng)。若程序中寄存器變量的數(shù)量超過極限時(shí),編譯系統(tǒng)可能自動(dòng)將它們轉(zhuǎn)換成自動(dòng)變量,從而保證了程序的可移植性;第26頁,共32頁,2023年,2月20日,星期一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次冪。第27頁,共32頁,2023年,2月20日,星期一最后總結(jié):全局變量和靜態(tài)變量只在程序的開始一次生成;局部變量和寄存器變量在進(jìn)入定義它們的程序塊和每個(gè)入口多次生成;沒有賦值的局部變量和寄存器變量在第一個(gè)賦值語句之前是末知的。例1:不同存儲(chǔ)類變量的應(yīng)用;例2:自動(dòng)類與局部靜態(tài)類變量的應(yīng)用;例3:由多個(gè)文件組成的程序中變量的作用域;第28頁,共32頁,2023年,2月20日,星期一#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;//例:不同存儲(chǔ)類型變量的應(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)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對用戶上傳內(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 出師表文言文試題及答案
- 2026黑龍江哈爾濱啟航勞務(wù)派遣有限公司派遣到哈爾濱工業(yè)大學(xué)全媒體中心招聘1人備考題庫必考題
- 仙女湖區(qū)2026年公開招聘衛(wèi)生專業(yè)技術(shù)人員考試備考題庫必考題
- 北京市大興區(qū)中醫(yī)醫(yī)院面向社會(huì)招聘臨時(shí)輔助用工5人參考題庫附答案
- 吉安市公安局2026年公開招聘警務(wù)輔助人員【58人】參考題庫必考題
- 成都印鈔有限公司2026年度工作人員招聘參考題庫必考題
- 招6人!湟源縣公安局2025年面向社會(huì)公開招聘警務(wù)輔助人員參考題庫必考題
- 浙江國企招聘-2026年紹興嵊州市水務(wù)投資發(fā)展集團(tuán)有限公司公開招聘工作人員8人參考題庫附答案
- 科技日報(bào)社招聘事業(yè)單位2人參考題庫必考題
- 貴州國企招聘:2025貴州磷化集團(tuán)下屬子公司湖北甕福海峪氟硅科技有限公司社會(huì)招聘29人參考題庫必考題
- 課例研究報(bào)告
- 建筑工程各部門職能及各崗位職責(zé)201702
- 五年級(jí)上冊道德與法治期末測試卷推薦
- 重點(diǎn)傳染病診斷標(biāo)準(zhǔn)培訓(xùn)診斷標(biāo)準(zhǔn)
- GB/T 3934-2003普通螺紋量規(guī)技術(shù)條件
- 蘭渝鐵路指導(dǎo)性施工組織設(shè)計(jì)
- CJJ82-2019-園林綠化工程施工及驗(yàn)收規(guī)范
- 小學(xué)三年級(jí)閱讀練習(xí)題《鴨兒餃子鋪》原文及答案
- 六宮格數(shù)獨(dú)100題
- 杭州電子招投標(biāo)系統(tǒng)使用辦法
- 車輛贈(zèng)與協(xié)議模板
評論
0/150
提交評論