版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
第七章變量的作用域與生存期§7.1作用域與生存期概述▲變量的作用域(空間特性)●
變量的作用域也稱為可見性,指變量能夠被訪問的范圍?!?/p>
根據不同的作用域,變量可分為局部變量和全局變量兩類。局部變量的作用范圍限定在程序中的部分區(qū)域(函數、復合語句);全局變量的作用范圍可以是整個文件甚至是整個程序?!兞康拇鎯︻悇e(時間特性)除作用域(可見性)外的另外兩個特性:變量所在存儲單元如何分配(存儲位置)?變量何時存在(生存期)?———存儲類別?!褡兞康拇娣盼恢茫篟AM或CPU寄存器●
內存區(qū)域劃分:代碼區(qū)、靜態(tài)存儲區(qū)、動態(tài)存儲區(qū)●存儲類別:靜態(tài)存儲、自動存儲●靜態(tài)存儲方式:存放在靜態(tài)存儲區(qū),編譯時就分配確定的相對位置,程序調入內存時即分配了固定的內存單元(靜態(tài)分配)生存期為整個程序的運行過程?!褡詣哟鎯Ψ绞剑捍娣旁趧討B(tài)存儲區(qū)(棧區(qū)),臨時分配。生存期僅在函數或復合語句(調用)執(zhí)行期間。▲定義變量的聲明格式決定了存儲類別,進而決定了變量的生存期;而該定義變量的聲明位置(內部/外部)則決定了變量的作用域.▲內部變量※定義:在函數內或復合語句內定義,只在本函數內或復合語句內有效?!f明:●main中定義的變量只在main中有效;●不同函數中同名變量,占不同內存單元;●形參屬于內部變量;●分為自動變量、寄存器變量和靜態(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]);}【例】不同函數中同名變量【例】復合語句中變量運行結果:54321運行結果:main:a=3,b=4sub:a=6,b=7main:a=3,b=4▲自動變量(auto)※格式:[auto]類型變量名列表;
auto可省略,autointa;等價于inta;※自動變量的生存期:自動變量存在于RAM中的動態(tài)存儲區(qū)—“?!?,并且僅當定義它的函數或復合語句被執(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)變量?!?/p>
由于寄存器數量很少,不能保證定義的寄存器變量總是能分配到寄存器,這時作為普通變量?!鶎τ诩拇嫫髯兞?,不能做取地址(&)運算?!纠渴褂眉拇嫫髯兞縤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)存儲方式存放,作用域仍然是僅限于所在的函數或復合語句?!袷剑簊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外部變量●
定義:在函數外定義●
作用域:(1)默認:從定義變量的位置開始到本源文件結束。(2)擴展:到其它源文件(其它源文件須用關鍵字extern聲明變量)。(3)限制在本源文件:定義時加關鍵字static?!裆嫫冢赫麄€程序運行期間
定義聲明次數:只能1次可說明多次位置:所有函數之外函數內或函數外分配內存:分配內存,可初始化不分配內存,不可初始化●
若外部變量與內部變量同名,則在函數中外部變量被屏蔽。/*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外部變量增加了函數間數據聯系的渠道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生存期:▲數據在內存中的分配方式※靜態(tài)內存分配的特點●由編譯器在編譯階段自動完成,不需要程序設計者干預或管理;●分配效率高;●由于分配的存儲區(qū)域其大小是固定不可變的,也存在明顯的不足之處;※動態(tài)內存分配(1)棧分配:自動變量存放在動態(tài)存儲區(qū)中的棧區(qū),只有當其所在的函數或復合語句被調用執(zhí)行時才在棧區(qū)中為其臨時分配存儲單元,函數或復合語句一次執(zhí)行結束后,所占用的存儲單元就被釋放,且后分配的存儲單元會被先釋放?!?.4動態(tài)內存分配▲數據在內存中的分配方式※動態(tài)內存分配(2)堆分配堆(heap)是動態(tài)內存區(qū)域中一部分自由空閑區(qū)域(一般是不連續(xù),使用鏈表方式來管理,可包括多個大小不等的空閑區(qū)域)。C程序設計者可以通過庫函數在堆中申請存儲空間,不需要時可以釋放(即返回給堆),釋放后的存儲空間又可以被再次申請使用。優(yōu)點:根據實際需要的大小來申請和分配存儲空間,不需要時隨時可以釋放。注意,申請的存儲空間不宜過大
?!ㄟ^庫函數申請和釋放存儲空間的方法(1)申請malloc函數
v
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 房地產行業(yè)購房風險告知合同
- 物流配送安全責任及免責協(xié)議
- 珠寶首飾銷售代理合作合同
- 智能機器人自動化生產線合作協(xié)議
- 2025年企業(yè)內部景觀施工合同協(xié)議3篇
- 2025年度盤扣式建筑模板工程設計施工一體化合同4篇
- 2025年度塑料袋環(huán)保標準檢測與認證合同
- 2025年新型節(jié)能玻璃隔斷研發(fā)與應用合同3篇
- 2025年度生物醫(yī)藥企業(yè)投資者退出增資擴股股權轉讓協(xié)議
- 2025年度購物中心寵物用品供應商合作協(xié)議3篇
- 能源管理體系記錄表單
- 智慧城市建設課件
- 污水處理廠提標升級可研
- 湖南省建設工程施工階段監(jiān)理服務費計費規(guī)則【實用文檔】doc
- GB/T 6913-2008鍋爐用水和冷卻水分析方法磷酸鹽的測定
- GB/T 18717.2-2002用于機械安全的人類工效學設計第2部分:人體局部進入機械的開口尺寸確定原則
- 中國文化概論(第三版)全套課件
- 117-鋼結構工程質量常見問題與管控措施
- SHS5230三星指紋鎖中文說明書
- 諾和關懷俱樂部對外介紹
- 新蘇教版科學六年級下冊全冊教案(含反思)
評論
0/150
提交評論