版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
第七章變量的作用域與生存期§7.1作用域與生存期概述▲變量的作用域(空間特性)●
變量的作用域也稱為可見性,指變量能夠被訪問的范圍。●
根據(jù)不同的作用域,變量可分為局部變量和全局變量兩類。局部變量的作用范圍限定在程序中的部分區(qū)域(函數(shù)、復(fù)合語句);全局變量的作用范圍可以是整個(gè)文件甚至是整個(gè)程序。▲變量的存儲(chǔ)類別(時(shí)間特性)除作用域(可見性)外的另外兩個(gè)特性:變量所在存儲(chǔ)單元如何分配(存儲(chǔ)位置)?變量何時(shí)存在(生存期)?———存儲(chǔ)類別?!褡兞康拇娣盼恢茫篟AM或CPU寄存器●
內(nèi)存區(qū)域劃分:代碼區(qū)、靜態(tài)存儲(chǔ)區(qū)、動(dòng)態(tài)存儲(chǔ)區(qū)●存儲(chǔ)類別:靜態(tài)存儲(chǔ)、自動(dòng)存儲(chǔ)●靜態(tài)存儲(chǔ)方式:存放在靜態(tài)存儲(chǔ)區(qū),編譯時(shí)就分配確定的相對(duì)位置,程序調(diào)入內(nèi)存時(shí)即分配了固定的內(nèi)存單元(靜態(tài)分配)生存期為整個(gè)程序的運(yùn)行過程?!褡詣?dòng)存儲(chǔ)方式:存放在動(dòng)態(tài)存儲(chǔ)區(qū)(棧區(qū)),臨時(shí)分配。生存期僅在函數(shù)或復(fù)合語句(調(diào)用)執(zhí)行期間?!x變量的聲明格式?jīng)Q定了存儲(chǔ)類別,進(jìn)而決定了變量的生存期;而該定義變量的聲明位置(內(nèi)部/外部)則決定了變量的作用域.▲內(nèi)部變量※定義:在函數(shù)內(nèi)或復(fù)合語句內(nèi)定義,只在本函數(shù)內(nèi)或復(fù)合語句內(nèi)有效?!f明:●main中定義的變量只在main中有效;●不同函數(shù)中同名變量,占不同內(nèi)存單元;●形參屬于內(nèi)部變量;●分為自動(dòng)變量、寄存器變量和靜態(tài)內(nèi)部變量
?!?.2內(nèi)部變量floatf1(inta){intb,c;…….}charf2(intx,inty){inti,j;……}main(){intm,n;…….}a,b,c有效x,y,i,j有效m,n有效voidsub(){
int
a,b;a=6;b=7;
printf("sub:a=%d,b=%d\n",a,b);}void
main(){inta,b;a=3;b=4;
printf("main:a=%d,b=%d\n",a,b);sub();
printf("main:a=%d,b=%d\n",a,b);}#defineN5voidmain(){inti;
int
a[N]={1,2,3,4,5};
for(i=0;i<N/2;i++)
{
inttemp; temp=a[i];
a[i]=a[N-i-1]; a[N-i-1]=temp;
}
for(i=0;i<N;i++)
printf("%d",a[i]);}【例】不同函數(shù)中同名變量【例】復(fù)合語句中變量運(yùn)行結(jié)果:54321運(yùn)行結(jié)果:main:a=3,b=4sub:a=6,b=7main:a=3,b=4▲自動(dòng)變量(auto)※格式:[auto]類型變量名列表;
auto可省略,autointa;等價(jià)于inta;※自動(dòng)變量的生存期:自動(dòng)變量存在于RAM中的動(dòng)態(tài)存儲(chǔ)區(qū)—“?!?,并且僅當(dāng)定義它的函數(shù)或復(fù)合語句被執(zhí)行時(shí),才創(chuàng)建該變量,執(zhí)行結(jié)束后該變量自動(dòng)被刪除掉,釋放占用的內(nèi)存空間?!詣?dòng)變量用的最多,不會(huì)永久占用內(nèi)存空間。#include<stdio.h>main(){autoint
a,b,c;a=1,b=2;c=add(a,b);/*創(chuàng)建add形參和局部變量*/{floatx=c;
printf("x=%f",x);}
printf("c=%d",c);}int
add(int
x,inty){intz;z=x+y;return(z);}a,b,c有效x,y,z有效x有效▲寄存器變量(建議不使用)
※格式:register類型變量名列表;※關(guān)鍵字register的真正作用是提醒編譯程序所定義的變量在程序中使用頻率較高。
※注意:●只有字符型、整型變量能放在寄存器中,包括:int、char、short、long等?!窦拇嫫髯兞勘仨毷莂uto類型的局部變量、形參,不能是全局變量或靜態(tài)變量?!?/p>
由于寄存器數(shù)量很少,不能保證定義的寄存器變量總是能分配到寄存器,這時(shí)作為普通變量?!鶎?duì)于寄存器變量,不能做取地址(&)運(yùn)算?!纠渴褂眉拇嫫髯兞縤nt
fac(intn){
registerinti,f=1;
for(i=1;i<=n;i++)f=f*i;
return(f);}voidmain(){
inti;
for(i=1;i<=1000;i++)
printf(“%d!=%d\n”,i,fac(i));}▲靜態(tài)內(nèi)部變量
※靜態(tài)存儲(chǔ)方式存放,作用域仍然是僅限于所在的函數(shù)或復(fù)合語句。※格式:static類型變量名列表;
staticinta;※形參不能是定義成static?!褂米⒁猓骸耢o態(tài)變量只初始化一次。●靜態(tài)變量的值具有“記憶”性?!癖M管生存期變長,但作用域(可見性)仍然局限在定義它的局部范圍內(nèi)。voidmain(){
inti;
for(i=0;i<3;i++)
inc1();
for(i=0;i<3;i++)
inc2();}【例】靜態(tài)內(nèi)部變量的生存期#include<stdio.h>voidinc1(){
intx=0;x++;
printf("ininc1x=%d\n",x);}voidinc2(){staticintx=0;x++;
printf("ininc2x=%d\n",x);}運(yùn)行結(jié)果:ininc1x=1ininc1x=1ininc1x=1ininc2x=1ininc2x=2ininc2x=3§7.3外部變量●
定義:在函數(shù)外定義●
作用域:(1)默認(rèn):從定義變量的位置開始到本源文件結(jié)束。(2)擴(kuò)展:到其它源文件(其它源文件須用關(guān)鍵字extern聲明變量)。(3)限制在本源文件:定義時(shí)加關(guān)鍵字static?!裆嫫冢赫麄€(gè)程序運(yùn)行期間
定義聲明次數(shù):只能1次可說明多次位置:所有函數(shù)之外函數(shù)內(nèi)或函數(shù)外分配內(nèi)存:分配內(nèi)存,可初始化不分配內(nèi)存,不可初始化●
若外部變量與內(nèi)部變量同名,則在函數(shù)中外部變量被屏蔽。/*ch7_17.c*/inta=3,b=5;int
max(inta,intb){intc;c=a>b?a:b;return(c);}voidmain(){
inta=8;
printf("max=%d",max(a,b));}【例】外部變量與內(nèi)部變量(同名的局部變量屏蔽外部變量)運(yùn)行結(jié)果:max=8floatmax,min;floataverage(floatarray[],intn){inti;floatsum=array[0];
max=min=array[0];for(i=1;i<n;i++){if(array[i]>max)
max
=array[i];elseif(array[i]<min)min
=array[i];sum+=array[i];}return(sum/n);}voidmain(){inti;floatave,score[10];/*Inputdatatoscore省略*/
ave=average(score,10);
printf("max=%6.2f\nmin=%6.2f\naverage=%6.2f\n",max,min,ave);}作用域maxmin外部變量增加了函數(shù)間數(shù)據(jù)聯(lián)系的渠道intp=1,q=5;floatf1(inta){intb,c;…….}intf3(){…..}charc1,c2;charf2(intx,inty){inti,j;……}main(){intm,n;…….}c1,c2原來的作用范圍p,q的作用范圍externcharc1,c2;externcharc1,c2;c1,c2的作用范圍擴(kuò)展后c1,c2的作用范圍擴(kuò)展后用extern聲明外部變量可以擴(kuò)展外部變量的作用域int
add(int
x,inty){
intz;z=x+y;returnz;}voidmain(){
externint
a,b;
printf(“a+b=%d\n",add(a,b));}inta=3,b=4;【例】用extern擴(kuò)展外部變量作用域運(yùn)行結(jié)果:a+b=7【例】用extern將變量的作用域擴(kuò)展到其它文件中intx=10,y=10;externvoidsub();voidadd(void){inty=5;y=10+x;x*=2;
printf("add:y=%d:",y);}voidmain(){x+=5;add();sub();
printf("main:x=%d,main:y=%d\n",x,y);}externintx;voidsub(){
inty=5;x-=y;
printf("sub:y=%d;",y);}file1.cfile2.c運(yùn)行結(jié)果:add:y=25;sub:y=5;main:x=25;main:y=10;staticintx=10;voidadd2(){externinty;x+=10;y+=2;
printf("inadd2x=%d\n",x);}【例】static
型外部變量的作用域受到限制,限制在本文件內(nèi)使用。運(yùn)行結(jié)果:inadd1x=4inadd2x=20inadd1x=6inadd2x=30x=6;y=13staticintx=2;inty=3;externvoidadd2();voidadd1();voidmain(){add1();add2();add1();add2();
printf("x=%d;y=%d\n",x,y);}voidadd1(){x+=2;y+=3;
printf("in
addax=%d\n",x);}inti;voidmain(){voidprt();
for(i=0;i<5;i++)
prt();}voidprt(){
for(i=0;i<5;i++)
printf(“%c”,’*’);
printf(“\n”);}【例】外部變量副作用運(yùn)行結(jié)果:*****【例】文件file1.cinta;voidmain(){…….…….f2;…….f1;…….}f1(){autointb;………f2;……..}f2(){staticintc;………}C作用域b作用域a作用域mainf2f1mainf1f2maina生存期:b生存期:c生存期:▲數(shù)據(jù)在內(nèi)存中的分配方式※靜態(tài)內(nèi)存分配的特點(diǎn)●由編譯器在編譯階段自動(dòng)完成,不需要程序設(shè)計(jì)者干預(yù)或管理;●分配效率高;●由于分配的存儲(chǔ)區(qū)域其大小是固定不可變的,也存在明顯的不足之處;※動(dòng)態(tài)內(nèi)存分配(1)棧分配:自動(dòng)變量存放在動(dòng)態(tài)存儲(chǔ)區(qū)中的棧區(qū),只有當(dāng)其所在的函數(shù)或復(fù)合語句被調(diào)用執(zhí)行時(shí)才在棧區(qū)中為其臨時(shí)分配存儲(chǔ)單元,函數(shù)或復(fù)合語句一次執(zhí)行結(jié)束后,所占用的存儲(chǔ)單元就被釋放,且后分配的存儲(chǔ)單元會(huì)被先釋放?!?.4動(dòng)態(tài)內(nèi)存分配▲數(shù)據(jù)在內(nèi)存中的分配方式※動(dòng)態(tài)內(nèi)存分配(2)堆分配堆(heap)是動(dòng)態(tài)內(nèi)存區(qū)域中一部分自由空閑區(qū)域(一般是不連續(xù),使用鏈表方式來管理,可包括多個(gè)大小不等的空閑區(qū)域)。C程序設(shè)計(jì)者可以通過庫函數(shù)在堆中申請(qǐng)存儲(chǔ)空間,不需要時(shí)可以釋放(即返回給堆),釋放后的存儲(chǔ)空間又可以被再次申請(qǐng)使用。優(yōu)點(diǎn):根據(jù)實(shí)際需要的大小來申請(qǐng)和分配存儲(chǔ)空間,不需要時(shí)隨時(shí)可以釋放。注意,申請(qǐng)的存儲(chǔ)空間不宜過大
。▲通過庫函數(shù)申請(qǐng)和釋放存儲(chǔ)空間的方法(1)申請(qǐng)malloc函數(shù)
v
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 埃萊爾-當(dāng)洛綜合征的臨床護(hù)理
- JJF(陜) 111-2024 超聲流量計(jì)在線校準(zhǔn)規(guī)范
- 《教綜合布線技術(shù)》課件
- 《保險(xiǎn)家庭財(cái)產(chǎn)保險(xiǎn)》課件
- 風(fēng)險(xiǎn)識(shí)別與評(píng)估技巧培訓(xùn)
- 培養(yǎng)創(chuàng)新思維的方法計(jì)劃
- 深入分析行業(yè)趨勢(shì)制定行動(dòng)方案計(jì)劃
- 2024-2025學(xué)年九年級(jí)數(shù)學(xué)人教版下冊(cè)專題整合復(fù)習(xí)卷第28章 銳角三角函數(shù)整章測(cè)試(含答案)
- 杠桿基金合同三篇
- 拖拉機(jī)及農(nóng)林牧漁用掛車相關(guān)行業(yè)投資方案
- 表面活性劑對(duì)水環(huán)境的影響
- 托輥技術(shù)規(guī)格書
- CRH2型動(dòng)車組一級(jí)檢修作業(yè)辦法081222
- 淺談失業(yè)保險(xiǎn)的擴(kuò)面征繳
- (完整版)西南財(cái)經(jīng)大學(xué)計(jì)量經(jīng)濟(jì)學(xué)期末考試試題
- 研究生英語議論文范文模板
- 酒店建筑BIM實(shí)施方案
- 員工工資條模板(indoc整理)
- 燃?xì)獍踩R(shí)測(cè)試題(含答案)
- 拆遷安置房小區(qū)物業(yè)管理的問題與對(duì)策
- 詹姆斯·斯特林1.doc1PPT
評(píng)論
0/150
提交評(píng)論