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

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

第七章變量的作用域與生存期§7.1作用域與生存期概述▲變量的作用域(空間特性)●

變量的作用域也稱為可見性,指變量能夠被訪問的范圍?!?/p>

根據(jù)不同的作用域,變量可分為局部變量和全局變量兩類。局部變量的作用范圍限定在程序中的部分區(qū)域(函數(shù)、復合語句);全局變量的作用范圍可以是整個文件甚至是整個程序。▲變量的存儲類別(時間特性)除作用域(可見性)外的另外兩個特性:變量所在存儲單元如何分配(存儲位置)?變量何時存在(生存期)?———存儲類別?!褡兞康拇娣盼恢茫篟AM或CPU寄存器●

內存區(qū)域劃分:代碼區(qū)、靜態(tài)存儲區(qū)、動態(tài)存儲區(qū)●存儲類別:靜態(tài)存儲、自動存儲●靜態(tài)存儲方式:存放在靜態(tài)存儲區(qū),編譯時就分配確定的相對位置,程序調入內存時即分配了固定的內存單元(靜態(tài)分配)生存期為整個程序的運行過程?!褡詣哟鎯Ψ绞剑捍娣旁趧討B(tài)存儲區(qū)(棧區(qū)),臨時分配。生存期僅在函數(shù)或復合語句(調用)執(zhí)行期間?!x變量的聲明格式?jīng)Q定了存儲類別,進而決定了變量的生存期;而該定義變量的聲明位置(內部/外部)則決定了變量的作用域.▲內部變量※定義:在函數(shù)內或復合語句內定義,只在本函數(shù)內或復合語句內有效?!f明:●main中定義的變量只在main中有效;●不同函數(shù)中同名變量,占不同內存單元;●形參屬于內部變量;●分為自動變量、寄存器變量和靜態(tài)內部變量

?!?.2內部變量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ù)中同名變量【例】復合語句中變量運行結果:54321運行結果:main:a=3,b=4sub:a=6,b=7main:a=3,b=4▲自動變量(auto)※格式:[auto]類型變量名列表;

auto可省略,autointa;等價于inta;※自動變量的生存期:自動變量存在于RAM中的動態(tài)存儲區(qū)—“?!?,并且僅當定義它的函數(shù)或復合語句被執(zhí)行時,才創(chuàng)建該變量,執(zhí)行結束后該變量自動被刪除掉,釋放占用的內存空間?!詣幼兞坑玫淖疃啵粫谰谜加脙却婵臻g。#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類型變量名列表;※關鍵字register的真正作用是提醒編譯程序所定義的變量在程序中使用頻率較高。

※注意:●只有字符型、整型變量能放在寄存器中,包括:int、char、short、long等?!窦拇嫫髯兞勘仨毷莂uto類型的局部變量、形參,不能是全局變量或靜態(tài)變量。※

由于寄存器數(shù)量很少,不能保證定義的寄存器變量總是能分配到寄存器,這時作為普通變量?!鶎τ诩拇嫫髯兞?,不能做取地址(&)運算?!纠渴褂眉拇嫫髯兞縤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)內部變量

※靜態(tài)存儲方式存放,作用域仍然是僅限于所在的函數(shù)或復合語句?!袷剑簊tatic類型變量名列表;

staticinta;※形參不能是定義成static。※使用注意:●靜態(tài)變量只初始化一次?!耢o態(tài)變量的值具有“記憶”性?!癖M管生存期變長,但作用域(可見性)仍然局限在定義它的局部范圍內。voidmain(){

inti;

for(i=0;i<3;i++)

inc1();

for(i=0;i<3;i++)

inc2();}【例】靜態(tài)內部變量的生存期#include<stdio.h>voidinc1(){

intx=0;x++;

printf("ininc1x=%d\n",x);}voidinc2(){staticintx=0;x++;

printf("ininc2x=%d\n",x);}運行結果:ininc1x=1ininc1x=1ininc1x=1ininc2x=1ininc2x=2ininc2x=3§7.3外部變量●

定義:在函數(shù)外定義●

作用域:(1)默認:從定義變量的位置開始到本源文件結束。(2)擴展:到其它源文件(其它源文件須用關鍵字extern聲明變量)。(3)限制在本源文件:定義時加關鍵字static。●生存期:整個程序運行期間

定義聲明次數(shù):只能1次可說明多次位置:所有函數(shù)之外函數(shù)內或函數(shù)外分配內存:分配內存,可初始化不分配內存,不可初始化●

若外部變量與內部變量同名,則在函數(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));}【例】外部變量與內部變量(同名的局部變量屏蔽外部變量)運行結果: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的作用范圍擴展后c1,c2的作用范圍擴展后用extern聲明外部變量可以擴展外部變量的作用域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擴展外部變量作用域運行結果:a+b=7【例】用extern將變量的作用域擴展到其它文件中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運行結果: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

型外部變量的作用域受到限制,限制在本文件內使用。運行結果: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”);}【例】外部變量副作用運行結果:*****【例】文件file1.cinta;voidmain(){…….…….f2;…….f1;…….}f1(){autointb;………f2;……..}f2(){staticintc;………}C作用域b作用域a作用域mainf2f1mainf1f2maina生存期:b生存期:c生存期:▲數(shù)據(jù)在內存中的分配方式※靜態(tài)內存分配的特點●由編譯器在編譯階段自動完成,不需要程序設計者干預或管理;●分配效率高;●由于分配的存儲區(qū)域其大小是固定不可變的,也存在明顯的不足之處;※動態(tài)內存分配(1)棧分配:自動變量存放在動態(tài)存儲區(qū)中的棧區(qū),只有當其所在的函數(shù)或復合語句被調用執(zhí)行時才在棧區(qū)中為其臨時分配存儲單元,函數(shù)或復合語句一次執(zhí)行結束后,所占用的存儲單元就被釋放,且后分配的存儲單元會被先釋放?!?.4動態(tài)內存分配▲數(shù)據(jù)在內存中的分配方式※動態(tài)內存分配(2)堆分配堆(heap)是動態(tài)內存區(qū)域中一部分自由空閑區(qū)域(一般是不連續(xù),使用鏈表方式來管理,可包括多個大小不等的空閑區(qū)域)。C程序設計者可以通過庫函數(shù)在堆中申請存儲空間,不需要時可以釋放(即返回給堆),釋放后的存儲空間又可以被再次申請使用。優(yōu)點:根據(jù)實際需要的大小來申請和分配存儲空間,不需要時隨時可以釋放。注意,申請的存儲空間不宜過大

。▲通過庫函數(shù)申請和釋放存儲空間的方法(1)申請malloc函數(shù)

v

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論