變量的作用域與生存期-_第1頁
變量的作用域與生存期-_第2頁
變量的作用域與生存期-_第3頁
變量的作用域與生存期-_第4頁
變量的作用域與生存期-_第5頁
已閱讀5頁,還剩20頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(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ì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論