




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
第七章變量的作用域與生存期§7.1作用域與生存期概述▲變量的作用域(空間特性)●
變量的作用域也稱為可見性,指變量能夠被訪問的范圍?!?/p>
根據(jù)不同的作用域,變量可分為局部變量和全局變量兩類。局部變量的作用范圍限定在程序中的部分區(qū)域(函數(shù)、復(fù)合語句);全局變量的作用范圍可以是整個文件甚至是整個程序?!兞康拇鎯︻悇e(時間特性)除作用域(可見性)外的另外兩個特性:變量所在存儲單元如何分配(存儲位置)?變量何時存在(生存期)?———存儲類別?!褡兞康拇娣盼恢茫篟AM或CPU寄存器●
內(nèi)存區(qū)域劃分:代碼區(qū)、靜態(tài)存儲區(qū)、動態(tài)存儲區(qū)●存儲類別:靜態(tài)存儲、自動存儲●靜態(tài)存儲方式:存放在靜態(tài)存儲區(qū),編譯時就分配確定的相對位置,程序調(diào)入內(nèi)存時即分配了固定的內(nèi)存單元(靜態(tài)分配)生存期為整個程序的運(yùn)行過程。●自動存儲方式:存放在動態(tài)存儲區(qū)(棧區(qū)),臨時分配。生存期僅在函數(shù)或復(fù)合語句(調(diào)用)執(zhí)行期間。▲定義變量的聲明格式?jīng)Q定了存儲類別,進(jìn)而決定了變量的生存期;而該定義變量的聲明位置(內(nèi)部/外部)則決定了變量的作用域.▲內(nèi)部變量※定義:在函數(shù)內(nèi)或復(fù)合語句內(nèi)定義,只在本函數(shù)內(nèi)或復(fù)合語句內(nèi)有效。※說明:●main中定義的變量只在main中有效;●不同函數(shù)中同名變量,占不同內(nèi)存單元;●形參屬于內(nèi)部變量;●分為自動變量、寄存器變量和靜態(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▲自動變量(auto)※格式:[auto]類型變量名列表;
auto可省略,autointa;等價于inta;※自動變量的生存期:自動變量存在于RAM中的動態(tài)存儲區(qū)—“?!?,并且僅當(dāng)定義它的函數(shù)或復(fù)合語句被執(zhí)行時,才創(chuàng)建該變量,執(zhí)行結(jié)束后該變量自動被刪除掉,釋放占用的內(nèi)存空間。※自動變量用的最多,不會永久占用內(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ù)量很少,不能保證定義的寄存器變量總是能分配到寄存器,這時作為普通變量?!鶎τ诩拇嫫髯兞浚荒茏鋈〉刂?&)運(yùn)算。【例】使用寄存器變量int
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)存儲方式存放,作用域仍然是僅限于所在的函數(shù)或復(fù)合語句?!袷剑簊tatic類型變量名列表;
staticinta;※形參不能是定義成static。※使用注意:●靜態(tài)變量只初始化一次?!耢o態(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)限制在本源文件:定義時加關(guān)鍵字static?!裆嫫冢赫麄€程序運(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)存分配的特點●由編譯器在編譯階段自動完成,不需要程序設(shè)計者干預(yù)或管理;●分配效率高;●由于分配的存儲區(qū)域其大小是固定不可變的,也存在明顯的不足之處;※動態(tài)內(nèi)存分配(1)棧分配:自動變量存放在動態(tài)存儲區(qū)中的棧區(qū),只有當(dāng)其所在的函數(shù)或復(fù)合語句被調(diào)用執(zhí)行時才在棧區(qū)中為其臨時分配存儲單元,函數(shù)或復(fù)合語句一次執(zhí)行結(jié)束后,所占用的存儲單元就被釋放,且后分配的存儲單元會被先釋放。§7.4動態(tài)內(nèi)存分配▲數(shù)據(jù)在內(nèi)存中的分配方式※動態(tài)內(nèi)存分配(2)堆分配堆(heap)是動態(tài)內(nèi)存區(qū)域中一部分自由空閑區(qū)域(一般是不連續(xù),使用鏈表方式來管理,可包括多個大小不等的空閑區(qū)域)。C程序設(shè)計者可以通過庫函數(shù)在堆中申請存儲空間,不需要時可以釋放(即返回給堆),釋放后的存儲空間又可以被再次申請使用。優(yōu)點:根據(jù)實際需要的大小來申請和分配存儲空間,不需要時隨時可以釋放。注意,申請的存儲空間不宜過大
。▲通過庫函數(shù)申請和釋放存儲空間的方法(1)申請malloc函數(shù)
v
溫馨提示
- 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)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年南充客貨運(yùn)從業(yè)資格證考試教材
- 2025年四川道路貨運(yùn)輸從業(yè)資格證模擬考試題庫
- 誠信高考發(fā)言稿
- 2025年西寧貨運(yùn)從業(yè)資格證題庫年答案
- 《巴斯奎特涂鴉》幼兒園小學(xué)少兒美術(shù)教育繪畫課件創(chuàng)意教程教案
- 快遞公司常用合同
- 合伙開辦工廠經(jīng)營協(xié)議書
- 會員消費(fèi)記錄及積分兌換統(tǒng)計表
- 自然地理學(xué)知到課后答案智慧樹章節(jié)測試答案2025年春中山大學(xué)
- 幼兒園運(yùn)動員發(fā)言稿
- (2025)輔警招聘公安基礎(chǔ)知識必刷題庫及參考答案
- 農(nóng)業(yè)機(jī)械設(shè)備維護(hù)與質(zhì)量保障措施
- 基于圖像處理的CAD圖紙比對算法
- 人教版六年級下冊數(shù)學(xué)第二單元百分?jǐn)?shù)(二)綜合練習(xí)卷-(附答案)
- 2025年大模型應(yīng)用落地白皮書:企業(yè)AI轉(zhuǎn)型行動指南
- 《習(xí)近平法治思想概論(第二版)》 課件 2. 第二章 習(xí)近平法治思想的理論意義
- 2025年中國文玩電商行業(yè)發(fā)展現(xiàn)狀調(diào)查、競爭格局分析及未來前景預(yù)測報告
- 人教版高中英語挖掘文本深度學(xué)習(xí)-選修四-UNIT-4(答案版)
- 2024 大模型典型示范應(yīng)用案例集-1
- 太陽能微動力農(nóng)村污水處理系統(tǒng)建設(shè)項目可行性研究報告
- JTG5120-2021公路橋涵養(yǎng)護(hù)規(guī)范
評論
0/150
提交評論