c語言程序設(shè)計(jì)(周經(jīng)亞)第7章-利用函數(shù)實(shí)現(xiàn)模塊化程序設(shè)計(jì)課件_第1頁
c語言程序設(shè)計(jì)(周經(jīng)亞)第7章-利用函數(shù)實(shí)現(xiàn)模塊化程序設(shè)計(jì)課件_第2頁
c語言程序設(shè)計(jì)(周經(jīng)亞)第7章-利用函數(shù)實(shí)現(xiàn)模塊化程序設(shè)計(jì)課件_第3頁
c語言程序設(shè)計(jì)(周經(jīng)亞)第7章-利用函數(shù)實(shí)現(xiàn)模塊化程序設(shè)計(jì)課件_第4頁
c語言程序設(shè)計(jì)(周經(jīng)亞)第7章-利用函數(shù)實(shí)現(xiàn)模塊化程序設(shè)計(jì)課件_第5頁
已閱讀5頁,還剩79頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

C語言程序設(shè)計(jì)周經(jīng)亞jy_zhou@計(jì)算機(jī)科學(xué)與技術(shù)學(xué)院C語言程序設(shè)計(jì)周經(jīng)亞作用域含義:

變量作用域是指該變量可以被訪問的代碼段范圍根據(jù)作用域劃分變量:

1、局部變量: 在某個(gè)函數(shù)內(nèi)部(包括main)定義,隸屬于該函數(shù);作用范圍為定義點(diǎn)到所屬函數(shù)結(jié)束;

2、全局變量: 在函數(shù)(包括main)外部定義,不屬于任何函數(shù); 作用范圍為定義點(diǎn)到本源文件的結(jié)束,為本文件中其他函數(shù)所共用;C語言程序設(shè)計(jì)@SoochowUniversity2第7章用函數(shù)實(shí)現(xiàn)模塊化程序設(shè)計(jì)-II作用域含義:C語言程序設(shè)計(jì)@SoochowUniversi全局/局部變量的注意點(diǎn)1)函數(shù)的形參是局部變量;2)復(fù)合語句中可定義變量; 例如:if(a>b) { inttemp; temp=a; a=b; b=temp;}3)不同函數(shù)中可以使用同名的局部變量,不同代碼段中使用的同名變量的含義不同;4)全局變量與局部變量同名時(shí),局部變量優(yōu)先級高于全局變量;例如:C語言程序設(shè)計(jì)@SoochowUniversity3全局/局部變量的注意點(diǎn)1)函數(shù)的形參是局部變量;C語言程序設(shè)例如:intp=1,q=5;floatf1(inta){ intb,c; ……}charc1;charf2(intx,inty){ intb,j; ……}main(){ intp,c1; ……}C語言程序設(shè)計(jì)@SoochowUniversity4main()里看到的是局部變量p例如:intp=1,q=5;C語言程序設(shè)計(jì)@Soochow全局變量的說明全局變量的優(yōu)點(diǎn):全局變量的作用是增加了函數(shù)間數(shù)據(jù)聯(lián)系的渠道命名慣例:例如:intg_num;全局變量的缺點(diǎn):全局變量在程序的全部執(zhí)行過程中都占用存儲(chǔ)單元,而不是僅在需要時(shí)才開辟單元它使函數(shù)的通用性降低了,因?yàn)楹瘮?shù)在執(zhí)行時(shí)要依賴于其所在的外部變量。不符合:在程序設(shè)計(jì)中,在劃分模塊時(shí)要求模塊的“內(nèi)聚性”強(qiáng)、與其他模塊的“耦合性”弱的原則使用全局變量過多,會(huì)降低程序的清晰性,人們往往難以清楚地判斷出每個(gè)瞬時(shí)各個(gè)外部變量的值建議:在程序中盡量限制使用全局變量?。?!C語言程序設(shè)計(jì)@SoochowUniversity5全局變量的說明全局變量的優(yōu)點(diǎn):C語言程序設(shè)計(jì)@Soochow變量的存儲(chǔ)類別從變量的作用域(即從空間)角度來分,可以分為全局變量和局部變量。從變量值存在的時(shí)間(即生存期)角度來分,可以分為靜態(tài)存儲(chǔ)方式和動(dòng)態(tài)存儲(chǔ)方式。靜態(tài)存儲(chǔ)方式是指在程序運(yùn)行期間分配固定的存儲(chǔ)空間的方式。動(dòng)態(tài)存儲(chǔ)方式則是在程序運(yùn)行期間根據(jù)需要進(jìn)行動(dòng)態(tài)的分配存儲(chǔ)空間的方式。C語言程序設(shè)計(jì)@SoochowUniversity6變量的存儲(chǔ)類別從變量的作用域(即從空間)角度來分,可以分為全C程序的內(nèi)存布局C程序一直由下列部分組成:1)正文段——CPU執(zhí)行的機(jī)器指令部分;一個(gè)程序只有一個(gè)副本;只讀,防止程序由于意外事故而修改自身指令;2)初始化數(shù)據(jù)段(數(shù)據(jù)段)——在程序中所有賦了初值的全局變量,存放在這里。3)非初始化數(shù)據(jù)段(bss段)——在程序中沒有初始化的全局變量;內(nèi)核將此段初始化為0。4)?!鲩L方向:自頂向下增長;自動(dòng)變量以及每次函數(shù)調(diào)用時(shí)所需要保存的信息(返回地址;環(huán)境信息)。5)堆——?jiǎng)討B(tài)存儲(chǔ)分配。|-----------|(后面會(huì)講到的指針類型,它分配的內(nèi)存空間就是在堆上)C語言程序設(shè)計(jì)@SoochowUniversity7|-----------||||-----------||棧||-----------|||||/|\|||||-----------||堆||-----------||未初始化||-----------||初始化||-----------||正文段||-----------|C程序的內(nèi)存布局C程序一直由下列部分組成:C語言程序設(shè)計(jì)@SC程序的內(nèi)存布局//file.cintg_minV=0;//全局變量intmax(intx,inty){ g_minV=x<y?x:y; return(x>y?x:y);}intg_maxV;//全局變量voidmain(){ intx=6,y=9; maxV=max(x,y); printf("Themaxvalue:%d",g_maxV); printf("Theminvalue:%d",g_minV);}C語言程序設(shè)計(jì)@SoochowUniversity8形參實(shí)參|-----------||||-----------||棧||-----------|||||/|\|||||||-----------||堆||-----------||未初始化||-----------||初始化||-----------||正文段||||-----------|正文段codeg_minV……..g_maxV……..堆x=6y=9………..x=6y=9main()max()形參實(shí)參初始化未初始化程序段動(dòng)態(tài)存儲(chǔ)區(qū)靜態(tài)存儲(chǔ)區(qū)程序區(qū)C程序的內(nèi)存布局//file.cC語言程序設(shè)計(jì)@Soocho函數(shù)調(diào)用機(jī)制函數(shù)調(diào)用過程建立被調(diào)函數(shù)的??臻g保護(hù)調(diào)用函數(shù)的運(yùn)行狀態(tài)和返回地址目的是保護(hù)好現(xiàn)場環(huán)境,以便函數(shù)調(diào)用完成后,能夠返回到調(diào)用函數(shù)前程序運(yùn)行的正確狀態(tài)傳遞參數(shù)傳遞的參數(shù)是放在棧空間中的,當(dāng)函數(shù)調(diào)用完成,??臻g就會(huì)釋放掉,所以默認(rèn)情況下,傳遞的參數(shù)是按值傳遞的(也就是形參對實(shí)參進(jìn)行值拷貝,形參和實(shí)參在內(nèi)存中其實(shí)是兩個(gè)完全不同的地址空間,只是二者的數(shù)值相同)將控制權(quán)轉(zhuǎn)交被調(diào)用函數(shù)被調(diào)用函數(shù)按照程序員預(yù)先編好的指令(代碼)開始執(zhí)行C語言程序設(shè)計(jì)@SoochowUniversity9函數(shù)調(diào)用機(jī)制函數(shù)調(diào)用過程C語言程序設(shè)計(jì)@SoochowUn動(dòng)態(tài)存儲(chǔ)方式與靜態(tài)存儲(chǔ)方式存儲(chǔ)類別數(shù)據(jù)在內(nèi)存中存儲(chǔ)的方法兩大類:靜態(tài)存儲(chǔ)類和動(dòng)態(tài)存儲(chǔ)類。具體包含四種:自動(dòng)的(auto),靜態(tài)的(static),寄存器的(register),外部的(extern)根據(jù)變量的存儲(chǔ)類別,可以知道變量的作用域和生存期。C語言程序設(shè)計(jì)@SoochowUniversity10動(dòng)態(tài)存儲(chǔ)方式與靜態(tài)存儲(chǔ)方式存儲(chǔ)類別C語言程序設(shè)計(jì)@Sooch

auto變量自動(dòng)變量:存儲(chǔ)在動(dòng)態(tài)存儲(chǔ)區(qū)的變量函數(shù)中的局部變量(包括函數(shù)形參),如不專門聲明為static存儲(chǔ)類別,都是動(dòng)態(tài)地分配存儲(chǔ)空間的。自動(dòng)變量用關(guān)鍵字auto作存儲(chǔ)類別的聲明。而且auto關(guān)鍵字可以省略.C語言程序設(shè)計(jì)@SoochowUniversity11例如:

intf(inta)/*定義f函數(shù),a為形參*/{

autointb,c=3;/*定義b、c為自動(dòng)變量*/…

}auto變量自動(dòng)變量:C語言程序設(shè)計(jì)@SoochowUn用static聲明局部變量靜態(tài)局部變量有時(shí)希望函數(shù)中的局部變量的值在函數(shù)調(diào)用結(jié)束后不消失而保留原值,即其占用的存儲(chǔ)單元不釋放,在下一次該函數(shù)調(diào)用時(shí),該變量已有值,就是上一次函數(shù)調(diào)用結(jié)束時(shí)的值,這時(shí)就應(yīng)該指定該局部變量為“靜態(tài)局部變量”。靜態(tài)局部變量用關(guān)鍵字static進(jìn)行聲明例如:staticinta=3;C語言程序設(shè)計(jì)@SoochowUniversity12用static聲明局部變量靜態(tài)局部變量C語言程序設(shè)計(jì)@Soo靜態(tài)變量

f(inta) { autointb=0;

staticintc=3;

b=b+1;

c=c+1;

return(a+b+c); }

main(){ inta=2,i;

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

printf("%d",f(a));}C語言程序設(shè)計(jì)@SoochowUniversity13運(yùn)行結(jié)果為: 7

8

9靜態(tài)變量 f(inta)C語言程序設(shè)計(jì)@SoochowU對靜態(tài)局部變量的說明(1)生存期靜態(tài)局部變量屬于靜態(tài)存儲(chǔ)類別,在靜態(tài)存儲(chǔ)區(qū)內(nèi)分配存儲(chǔ)單元。在程序整個(gè)運(yùn)行期間都不釋放。自動(dòng)變量(即動(dòng)態(tài)局部變量)屬于動(dòng)態(tài)存儲(chǔ)類別,占動(dòng)態(tài)存儲(chǔ)區(qū)空間而不占靜態(tài)存儲(chǔ)區(qū)空間,函數(shù)調(diào)用結(jié)束后即釋放。(2)初始化靜態(tài)局部變量是在編譯時(shí)初始化的,即只初始化一次,在程序運(yùn)行時(shí)它已有初值。以后每次調(diào)用函數(shù)時(shí)不再重新賦初值而只是保留上次函數(shù)調(diào)用結(jié)束時(shí)的值。自動(dòng)變量初始化不是在編譯時(shí)進(jìn)行的,而是在函數(shù)調(diào)用時(shí)進(jìn)行,每調(diào)用一次函數(shù)重新給一次初值,相當(dāng)于執(zhí)行一次賦值語句。C語言程序設(shè)計(jì)@SoochowUniversity14對靜態(tài)局部變量的說明(1)生存期C語言程序設(shè)計(jì)@Sooch對靜態(tài)局部變量的說明(3)默認(rèn)值:(在定義局部變量時(shí)不初始化)靜態(tài)局部變量在編譯時(shí)自動(dòng)賦初值0(對數(shù)值型變量)或空字符(對字符變量)。自動(dòng)變量的值是一個(gè)不確定的值。這是由于每次函數(shù)調(diào)用結(jié)束后存儲(chǔ)單元已釋放,下次調(diào)用時(shí)又重新另分配存儲(chǔ)單元,而所分配的單元中的值是不確定的。(4)作用域雖然靜態(tài)局部變量在函數(shù)調(diào)用結(jié)束后仍然存在,但其他函數(shù)是不能引用它的,也就是說作用域?qū)儆诙x變量的函數(shù)。(這是和全局變量的區(qū)別)自動(dòng)變量的作用域是屬于定義變量的函數(shù)。C語言程序設(shè)計(jì)@SoochowUniversity15對靜態(tài)局部變量的說明(3)默認(rèn)值:(在定義局部變量時(shí)不初需用靜態(tài)局部變量的幾種情況(1)需要保留函數(shù)上一次調(diào)用結(jié)束時(shí)的值。C語言程序設(shè)計(jì)@SoochowUniversity16intfac(intn){staticintf=1;

f=f*n;

return(f);}main(){inti;

for(i=1;i<=5;i++)

printf(“%d!=%d”,i,fac(i));

printf(“\n”);}運(yùn)行結(jié)果為:1?。?2!=23?。?4!=245?。?20需用靜態(tài)局部變量的幾種情況(1)需要保留函數(shù)上一次調(diào)用結(jié)束需用靜態(tài)局部變量的幾種情況(2)如果初始化后,變量只被引用而不改變其值,這時(shí)用靜態(tài)局部變量比較方便,以免每次調(diào)用時(shí)重新賦值。靜態(tài)局部變量的缺點(diǎn)用靜態(tài)存儲(chǔ)要多占內(nèi)存(長期占用不釋放,而不能像動(dòng)態(tài)存儲(chǔ)那樣一個(gè)存儲(chǔ)單元可供多個(gè)變量使用,節(jié)約內(nèi)存),而且降低了程序的可讀性,當(dāng)調(diào)用次數(shù)多時(shí)往往弄不清靜態(tài)局部變量的當(dāng)前值是什么。因此,如不必要,不要多用靜態(tài)局部變量。C語言程序設(shè)計(jì)@SoochowUniversity17需用靜態(tài)局部變量的幾種情況(2)如果初始化后,變量只被引用register變量一般情況下的變量存儲(chǔ)及運(yùn)算過程使用頻繁的變量的特殊使用方法:寄存器變量C語言允許將局部變量的值放在CPU的寄存器中存放在CPU寄存器中的變量叫做“寄存器變量”,用關(guān)鍵字register作聲明。C語言程序設(shè)計(jì)@SoochowUniversity18register變量一般情況下的變量存儲(chǔ)及運(yùn)算過程C語言程序例如

intfac(intn) {registerinti,f=1;/*定義寄存器變量*/

for(i=1;i<=n;i++)

f=f*i;

return(f); }

main(){ inti;

for(i=1;i<=5;i++)

printf(“%d?。剑\n”,i,fac(i));

}C語言程序設(shè)計(jì)@SoochowUniversity19例如 intfac(intn)C語言程序設(shè)計(jì)@Sooc有關(guān)寄存器變量說明(1)只有局部自動(dòng)變量和形式參數(shù)可以作為寄存器變量,其他(如全局變量)不行。在調(diào)用一個(gè)函數(shù)時(shí)占用一些寄存器以存放寄存器變量的值,函數(shù)調(diào)用結(jié)束釋放寄存器。此后,在調(diào)用另一個(gè)函數(shù)時(shí)又可以利用它來存放該函數(shù)的寄存器變量。(2)一個(gè)計(jì)算機(jī)系統(tǒng)中的寄存器數(shù)目是有限的,不能定義任意多個(gè)寄存器變量。(3)局部靜態(tài)變量不能定義為寄存器變量。不能寫成registerstaticinta,b,c;不能把變量a、b、c既放在靜態(tài)存儲(chǔ)區(qū)中,又放在寄存器中,二者只能居其一。對一個(gè)變量只能聲明為一個(gè)存儲(chǔ)類別。C語言程序設(shè)計(jì)@SoochowUniversity20有關(guān)寄存器變量說明(1)只有局部自動(dòng)變量和形式參數(shù)可以作為用extern聲明外部變量外部變量(即全局變量)的作用域的規(guī)定:它的作用域?yàn)閺淖兞康亩x處開始,到本程序文件的末尾。在此作用域內(nèi),全局變量可以為程序中各個(gè)函數(shù)所引用。編譯時(shí)將外部變量分配在靜態(tài)存儲(chǔ)區(qū)。外部變量(即全局變量)的作用域的擴(kuò)展:有時(shí)需要用extern來聲明外部變量,以擴(kuò)展外部變量的作用域C語言程序設(shè)計(jì)@SoochowUniversity21用extern聲明外部變量外部變量(即全局變量)的作用域的規(guī)用extern聲明外部變量1.在一個(gè)文件內(nèi)聲明外部變量如果外部變量不在文件的開頭定義,其有效的作用范圍只限于從定義處開始處起到文件終了的區(qū)域。如果在定義點(diǎn)之前的函數(shù)想引用該外部變量,則應(yīng)該在引用之前用關(guān)鍵字extern對該變量作“外部變量聲明”。表示該變量是一個(gè)已經(jīng)定義的外部變量。有了此聲明,就可以從“聲明”處起,合法地使用該外部變量。C語言程序設(shè)計(jì)@SoochowUniversity22用extern聲明外部變量1.在一個(gè)文件內(nèi)聲明外部變量C語言例如//file.c

intmax(intx,inty){/*定義max函數(shù)*/

return(x>y?x∶y);

} main()

{ externA,B;/*外部變量聲明*/ printf("%d",max(A,B));

} intA=13,B=-8;/*定義外部變量*/C語言程序設(shè)計(jì)@SoochowUniversity23用extern聲明外部變量時(shí),類型名可以寫也可以省寫。例如上例中的“externintA;”也可以寫成:“externA;”。例如//file.c C語言程序設(shè)計(jì)@SoochowUni用extern聲明外部變量2.在多文件的程序中聲明外部變量多文件的程序結(jié)構(gòu)中一個(gè)文件要使用另一個(gè)文件中定義的外部變量如果一個(gè)程序包含兩個(gè)文件,在兩個(gè)文件中都要用到同一個(gè)外部變量Num,不能分別在兩個(gè)文件中各自定義一個(gè)外部變量Num,否則在進(jìn)行程序的連接時(shí)會(huì)出現(xiàn)“重復(fù)定義”的錯(cuò)誤。多文件的程序結(jié)構(gòu)中外部變量引用的正確的做法:在任一個(gè)文件中定義外部變量Num,而在其他文件中用extern對Num作“外部變量聲明”。即externNum;在編譯和連接時(shí),系統(tǒng)會(huì)由此知道Num是一個(gè)已在別處定義的外部變量,并將在另一文件中定義的外部變量的作用域擴(kuò)展到本文件,在本文件中可以合法地引用外部變量Num。C語言程序設(shè)計(jì)@SoochowUniversity24用extern聲明外部變量2.在多文件的程序中聲明外部變量C多文件程序?qū)嵗胑xtern將外部變量的作用域擴(kuò)展到其他文件。本程序的作用是給定b的值,輸入a和m,求a×b和am的值。 文件file1.c中的內(nèi)容為:

intA;/*定義外部變量*/ main(){ intpower(int);/*對調(diào)用函數(shù)作聲明*/ intb=3,c,d,m;

printf(“enterthenumberaanditspowerm:\n”); scanf("%d,%d",&A,&m);

c=A*b;

printf("%d**%d=%d\n",A,b,c);

d=power(m);

printf(“%d*%d=%d”,A,m,d);}C語言程序設(shè)計(jì)@SoochowUniversity25文件file2.c中的內(nèi)容為:externA;/*聲明A為一個(gè)已定義的外部變量*/power(intn){inti,y=1;

for(i=1;i<=n;i++)

y*=A;

return(y);}多文件程序?qū)嵗胑xtern將外部變量的作用域擴(kuò)展到用extern聲明外部變量多文件中外部變量聲明的注意事項(xiàng):用這樣的全局變量應(yīng)十分慎重,因?yàn)樵趫?zhí)行一個(gè)文件中的函數(shù)時(shí),可能會(huì)改變了該全局變量的值,它會(huì)影響到另一文件中的函數(shù)執(zhí)行結(jié)果。多文件中外部變量聲明的深入理解:先在本文件中找外部變量的定義,如果找到,就在本文件中擴(kuò)展作用域。如果找不到,就在連接時(shí)從其他文件中找外部變量的定義,如果找到,就將作用域擴(kuò)展到本文件。如果找不到,按出錯(cuò)處理。C語言程序設(shè)計(jì)@SoochowUniversity26用extern聲明外部變量多文件中外部變量聲明的注意事項(xiàng):C用static聲明外部變量static聲明的含義:有時(shí)在程序設(shè)計(jì)中希望某些外部變量只限于被本文件引用,而不能被其他文件引用。這時(shí)可以在定義外部變量時(shí)加一個(gè)static聲明。C語言程序設(shè)計(jì)@SoochowUniversity27這里的extern聲明是無效的file1.cfile2.cstaticintA;externintA;main()fun(intn){{….…}A=A*n;…}用static聲明外部變量static聲明的含義:有時(shí)在程序用static聲明外部變量靜態(tài)外部變量用static聲明、只能用于本文件的外部變量(全局變量)稱為靜態(tài)外部變量。在程序設(shè)計(jì)中,常由若干人分別完成各個(gè)模塊,各人可以獨(dú)立地在其設(shè)計(jì)的文件中使用相同的外部變量名而互不相干。只需在每個(gè)文件中的外部變量前加上static即可。這就為程序的模塊化、通用性提供方便。如果已知道其他文件不引用本文件的外部變量,可以對本文件中的外部變量都加上static,成為靜態(tài)外部變量,以免被其他文件誤用。重要理解:需要指出對外部變量加static聲明,并不意味著這時(shí)才是靜態(tài)存儲(chǔ)(存放在靜態(tài)存儲(chǔ)區(qū)中),而不加static的是動(dòng)態(tài)存儲(chǔ)(存放在動(dòng)態(tài)存儲(chǔ)區(qū))。兩種形式的外部變量都是靜態(tài)存儲(chǔ)方式,只是作用范圍不同而已,都是在編譯時(shí)分配內(nèi)存的。C語言程序設(shè)計(jì)@SoochowUniversity28用static聲明外部變量靜態(tài)外部變量C語言程序設(shè)計(jì)@Soo關(guān)于變量的聲明和定義函數(shù)的聲明和定義的明顯區(qū)別:函數(shù)的聲明是函數(shù)的原型,而函數(shù)的定義是函數(shù)的本身。其實(shí)聲明就是通知編譯器函數(shù)的類型,參數(shù)的類型,返回值類型等;而定義是實(shí)實(shí)在在的分配內(nèi)存空間。同理,變量的聲明和定義也是一樣變量的定義和聲明之間的區(qū)別不是特別明顯:定義性聲明:需要建立存儲(chǔ)空間的變量聲明(如:inta;)引用性聲明:不需要建立存儲(chǔ)空間的聲明(如:externa;)。C語言程序設(shè)計(jì)@SoochowUniversity29關(guān)于變量的聲明和定義函數(shù)的聲明和定義的明顯區(qū)別:C語言程序設(shè)關(guān)于變量的聲明和定義廣義地說,聲明包括定義,但并非所有的聲明都是定義。對“inta;”

而言,它既是聲明,又是定義。而對“externa;”

而言,它是聲明而不是定義。一般為了敘述方便,把建立存儲(chǔ)空間的聲明稱定義,而把不需要建立存儲(chǔ)空間的聲明稱為聲明。顯然這里指的聲明是狹義的,即非定義性聲明。C語言程序設(shè)計(jì)@SoochowUniversity30

main(){externA;/*是聲明不是定義。聲明A是一個(gè)已定義的外部變量*/…}intA;/*是定義,定義A為整型外部變量*/關(guān)于變量的聲明和定義廣義地說,聲明包括定義,但并非所有的聲明關(guān)于變量的聲明和定義外部變量定義和外部變量聲明的含義是不同的外部變量的定義只能有一次,它的位置在所有函數(shù)之外,而同一文件中的外部變量的聲明可以有多次,它的位置可以在函數(shù)之內(nèi)(哪個(gè)函數(shù)要用就在哪個(gè)函數(shù)中聲明)也可以在函數(shù)之外(在外部變量的定義點(diǎn)之前)。變量的extern聲明只用作聲明,而不用于定義。變量的static聲明(1)對局部變量用static聲明,則為該變量分配的空間在整個(gè)程序執(zhí)行期間始終存在。(2)全局變量用static聲明,則該變量的作用域只限于本文件模塊(即被聲明的文件中)。某些聲明不能單獨(dú)進(jìn)行用auto、register、static聲明變量時(shí),是在定義變量的基礎(chǔ)上加上這些關(guān)鍵字,而不能單獨(dú)使用。C語言程序設(shè)計(jì)@SoochowUniversity31關(guān)于變量的聲明和定義外部變量定義和外部變量聲明的含義是不同的存儲(chǔ)類別小結(jié)對一個(gè)數(shù)據(jù)的定義,需要指定兩種屬性:數(shù)據(jù)類型和存儲(chǔ)類別,分別使用兩個(gè)關(guān)鍵字。如:staticinta;(靜態(tài)內(nèi)部整型變量或靜態(tài)外部整型變量)autocharc;(自動(dòng)變量,在函數(shù)內(nèi)定義)用extern聲明變量為已定義的外部變量,如:externb;(聲明b是一個(gè)已被定義的外部變量)C語言程序設(shè)計(jì)@SoochowUniversity32存儲(chǔ)類別小結(jié)對一個(gè)數(shù)據(jù)的定義,需要指定兩種屬性:數(shù)據(jù)類型和存從不同角度做歸納(1)從作用域角度分,有局部變量和全局變量。(2)從變量存在的時(shí)間來區(qū)分,有動(dòng)態(tài)存儲(chǔ)和靜態(tài)存儲(chǔ)兩種類型。(3)從變量值存放的位置來區(qū)分,可分為:內(nèi)存中靜態(tài)存儲(chǔ)區(qū)中存放;內(nèi)存中動(dòng)態(tài)存儲(chǔ)區(qū)中存放;CPU中的寄存器中存放。(4)關(guān)于作用域和生存期的概念。(5)static對局部變量和全局變量的作用不同。詳細(xì)的請參考原書內(nèi)容C語言程序設(shè)計(jì)@SoochowUniversity33從不同角度做歸納(1)從作用域角度分,有局部變量和全局變量內(nèi)部函數(shù)和外部函數(shù)基本概念

函數(shù)本質(zhì)上是全局的,因?yàn)橐粋€(gè)函數(shù)要被另外的函數(shù)調(diào)用,但是,也可以指定函數(shù)不能被其他文件調(diào)用。根據(jù)函數(shù)能否被其他源文件調(diào)用,將函數(shù)區(qū)分為內(nèi)部函數(shù)和外部函數(shù)。內(nèi)部函數(shù)內(nèi)部函數(shù)的概念:如果一個(gè)函數(shù)只能被本文件中其他函數(shù)所調(diào)用,它稱為內(nèi)部函數(shù)。內(nèi)部函數(shù)定義方法在定義內(nèi)部函數(shù)時(shí),在函數(shù)名和函數(shù)類型的前面加static。即static類型標(biāo)識(shí)符函數(shù)名(形參表)如staticintfun(inta,intb)內(nèi)部函數(shù)又稱靜態(tài)函數(shù)。使用內(nèi)部函數(shù),可以使函數(shù)只局限于所在文件,如果在不同的文件中有同名的內(nèi)部函數(shù),互不干擾。這樣不同的人可以分別編寫不同的函數(shù),而不必?fù)?dān)心所用函數(shù)是否會(huì)與其他文件中函數(shù)同名通常把只能由同一文件使用的函數(shù)和外部變量放在一個(gè)文件中,在它們前面都冠以static使之局部化,其他文件不能引用。C語言程序設(shè)計(jì)@SoochowUniversity34內(nèi)部函數(shù)和外部函數(shù)基本概念C語言程序設(shè)計(jì)@Soocho外部函數(shù)(1)在定義函數(shù)時(shí),如果在函數(shù)首部的最左端冠以關(guān)鍵字extern,則表示此函數(shù)是外部函數(shù),可供其他文件調(diào)用。如函數(shù)首部可以寫為

externintfun(inta,intb)

注意:C語言規(guī)定,如果在定義函數(shù)時(shí)省略extern,則隱含為外部函數(shù)。本書前面所用的函數(shù)都是外部函數(shù)。(2)在需要調(diào)用此函數(shù)的文件中,用extern聲明所用的函數(shù)是外部函數(shù)。 例。有一個(gè)字符串,內(nèi)有若干個(gè)字符,今輸入一個(gè)字符,要求程序?qū)⒆址性撟址麆h去。用外部函數(shù)實(shí)現(xiàn)。C語言程序設(shè)計(jì)@SoochowUniversity35外部函數(shù)(1)在定義函數(shù)時(shí),如果在函數(shù)首部的最左端冠以關(guān)鍵多文件實(shí)例

file1.c(文件1)

externenter-string(charstr[80]);

externdelete-string(charstr[],charch);

externprint-string(charstr[]);

/*以上3行聲明在本函數(shù)中將要調(diào)用的在其他文件中定義的3個(gè)函數(shù)*/main(){ charc;

charstr[80];

enter-string(str);

scanf(“%c”,&c);

delete-string(str,c);

print-string(str); }C語言程序設(shè)計(jì)@SoochowUniversity36file2.c(文件2)#include<studio.h>enter-string(charstr[80]){gets(str);}/*讀入字符串str*/多文件實(shí)例 file1.c(文件1)C語言程序設(shè)多文件實(shí)例

file3.c(文件3)

delete_string(charstr[],charch){inti,j;

for(i=j=0;str[i]!=‘\0’;i++)

if(str[i]!=ch)str[j++]=str[i];

str[j]=′\0′; }

file4.c(文件4)

print_string(charstr[]){

printf("%s",str);

}C語言程序設(shè)計(jì)@SoochowUniversity37運(yùn)行情況如下:abcdefgc(輸入str)c(輸入要?jiǎng)h去的字符)abdefg(輸出已刪去指定字符的字符串)多文件實(shí)例 file3.c(文件3)C語言程序設(shè)計(jì)@Sooc函數(shù)實(shí)例例題1:定義一個(gè)函數(shù)實(shí)現(xiàn)數(shù)組前后元素互換。如intary[5]={1,2,3,4,5}=>ary[5]={5,4,3,2,1}函數(shù)原型:voidconvertArray(intarray[],intn);C語言程序設(shè)計(jì)@SoochowUniversity38i<n/2i=0;temp=array[i];array[i]=array[n-i-1];array[n-i-1]=temp;i++Y結(jié)束函數(shù)實(shí)例例題1:C語言程序設(shè)計(jì)@SoochowUniver函數(shù)實(shí)例1C語言程序設(shè)計(jì)@SoochowUniversity39#include<stdio.h>voidconvertArray(intarray[],intn){ inti,temp; for(i=0;i<n/2;i++) { temp=array[i]; array[i]=array[n-i-1]; array[n-i-1]=temp; }}voidmain(){ intarray[5]={1,2,3,4,5}; inti; for(i=0;i<5;i++) { printf("%3d",array[i]); } printf("\n"); convertArray(array,5); for(i=0;i<5;i++) { printf("%3d",array[i]); } printf("\n");}函數(shù)實(shí)例1C語言程序設(shè)計(jì)@SoochowUniversit函數(shù)實(shí)例2設(shè)計(jì)一個(gè)函數(shù),實(shí)現(xiàn)字符串到double數(shù)據(jù)的轉(zhuǎn)換。要求不使用系統(tǒng)函數(shù)。用多文件形式實(shí)現(xiàn)C語言程序設(shè)計(jì)@SoochowUniversity40//file1.cdoublestrToDouble(charstr[]){doublenum=0,multi=1;intflag=0,i=0;while(str[i]!='\0'){ if(str[i]=='.') { flag=1; i++; continue; }

//處理整數(shù)部分 if(flag==0) { num=num*10+str[i]-'0'; }

//處理小數(shù)部分 else { multi*=10; num+=(str[i]-'0')/multi; } i++;}}函數(shù)實(shí)例2設(shè)計(jì)一個(gè)函數(shù),實(shí)現(xiàn)字符串到double數(shù)據(jù)的轉(zhuǎn)換。函數(shù)實(shí)例2//file2.c#include<stdio.h>#include“file1.c”或externdoublestrToDouble(charstr[]);voidmain(){ charstr[20]; doublenum;

printf("Pleasinputanumberstring:\n"); scanf("%s",str); num=strToDouble(str); printf(“原來字符串str:%s\n",str); printf(“轉(zhuǎn)換后的數(shù):%f\n",num);}C語言程序設(shè)計(jì)@SoochowUniversity41函數(shù)實(shí)例2//file2.cC語言程序設(shè)計(jì)@Soochow作業(yè)(與上次作業(yè)一起檢查)【基本函數(shù)設(shè)計(jì)、用地址傳遞參數(shù)】用隨機(jī)數(shù)來初始化一個(gè)整形數(shù)組,數(shù)組元素個(gè)數(shù)自定。編寫一個(gè)函數(shù),對數(shù)組進(jìn)行排序。編寫一個(gè)函數(shù),在屏幕上輸出數(shù)組內(nèi)容,每行輸出5個(gè)元素。編寫主函數(shù),調(diào)用上述函數(shù)測試其功能?!净竞瘮?shù)設(shè)計(jì)或遞歸函數(shù)設(shè)計(jì)】從鍵盤輸入一個(gè)十進(jìn)制正整數(shù),輸出這個(gè)整數(shù)的二進(jìn)制形式。轉(zhuǎn)換過程用一個(gè)函數(shù)來完成。作業(yè)(與上次作業(yè)一起檢查)【基本函數(shù)設(shè)計(jì)、用地址傳遞參數(shù)】用C語言程序設(shè)計(jì)周經(jīng)亞jy_zhou@計(jì)算機(jī)科學(xué)與技術(shù)學(xué)院C語言程序設(shè)計(jì)周經(jīng)亞作用域含義:

變量作用域是指該變量可以被訪問的代碼段范圍根據(jù)作用域劃分變量:

1、局部變量: 在某個(gè)函數(shù)內(nèi)部(包括main)定義,隸屬于該函數(shù);作用范圍為定義點(diǎn)到所屬函數(shù)結(jié)束;

2、全局變量: 在函數(shù)(包括main)外部定義,不屬于任何函數(shù); 作用范圍為定義點(diǎn)到本源文件的結(jié)束,為本文件中其他函數(shù)所共用;C語言程序設(shè)計(jì)@SoochowUniversity44第7章用函數(shù)實(shí)現(xiàn)模塊化程序設(shè)計(jì)-II作用域含義:C語言程序設(shè)計(jì)@SoochowUniversi全局/局部變量的注意點(diǎn)1)函數(shù)的形參是局部變量;2)復(fù)合語句中可定義變量; 例如:if(a>b) { inttemp; temp=a; a=b; b=temp;}3)不同函數(shù)中可以使用同名的局部變量,不同代碼段中使用的同名變量的含義不同;4)全局變量與局部變量同名時(shí),局部變量優(yōu)先級高于全局變量;例如:C語言程序設(shè)計(jì)@SoochowUniversity45全局/局部變量的注意點(diǎn)1)函數(shù)的形參是局部變量;C語言程序設(shè)例如:intp=1,q=5;floatf1(inta){ intb,c; ……}charc1;charf2(intx,inty){ intb,j; ……}main(){ intp,c1; ……}C語言程序設(shè)計(jì)@SoochowUniversity46main()里看到的是局部變量p例如:intp=1,q=5;C語言程序設(shè)計(jì)@Soochow全局變量的說明全局變量的優(yōu)點(diǎn):全局變量的作用是增加了函數(shù)間數(shù)據(jù)聯(lián)系的渠道命名慣例:例如:intg_num;全局變量的缺點(diǎn):全局變量在程序的全部執(zhí)行過程中都占用存儲(chǔ)單元,而不是僅在需要時(shí)才開辟單元它使函數(shù)的通用性降低了,因?yàn)楹瘮?shù)在執(zhí)行時(shí)要依賴于其所在的外部變量。不符合:在程序設(shè)計(jì)中,在劃分模塊時(shí)要求模塊的“內(nèi)聚性”強(qiáng)、與其他模塊的“耦合性”弱的原則使用全局變量過多,會(huì)降低程序的清晰性,人們往往難以清楚地判斷出每個(gè)瞬時(shí)各個(gè)外部變量的值建議:在程序中盡量限制使用全局變量?。?!C語言程序設(shè)計(jì)@SoochowUniversity47全局變量的說明全局變量的優(yōu)點(diǎn):C語言程序設(shè)計(jì)@Soochow變量的存儲(chǔ)類別從變量的作用域(即從空間)角度來分,可以分為全局變量和局部變量。從變量值存在的時(shí)間(即生存期)角度來分,可以分為靜態(tài)存儲(chǔ)方式和動(dòng)態(tài)存儲(chǔ)方式。靜態(tài)存儲(chǔ)方式是指在程序運(yùn)行期間分配固定的存儲(chǔ)空間的方式。動(dòng)態(tài)存儲(chǔ)方式則是在程序運(yùn)行期間根據(jù)需要進(jìn)行動(dòng)態(tài)的分配存儲(chǔ)空間的方式。C語言程序設(shè)計(jì)@SoochowUniversity48變量的存儲(chǔ)類別從變量的作用域(即從空間)角度來分,可以分為全C程序的內(nèi)存布局C程序一直由下列部分組成:1)正文段——CPU執(zhí)行的機(jī)器指令部分;一個(gè)程序只有一個(gè)副本;只讀,防止程序由于意外事故而修改自身指令;2)初始化數(shù)據(jù)段(數(shù)據(jù)段)——在程序中所有賦了初值的全局變量,存放在這里。3)非初始化數(shù)據(jù)段(bss段)——在程序中沒有初始化的全局變量;內(nèi)核將此段初始化為0。4)棧——增長方向:自頂向下增長;自動(dòng)變量以及每次函數(shù)調(diào)用時(shí)所需要保存的信息(返回地址;環(huán)境信息)。5)堆——?jiǎng)討B(tài)存儲(chǔ)分配。|-----------|(后面會(huì)講到的指針類型,它分配的內(nèi)存空間就是在堆上)C語言程序設(shè)計(jì)@SoochowUniversity49|-----------||||-----------||棧||-----------|||||/|\|||||-----------||堆||-----------||未初始化||-----------||初始化||-----------||正文段||-----------|C程序的內(nèi)存布局C程序一直由下列部分組成:C語言程序設(shè)計(jì)@SC程序的內(nèi)存布局//file.cintg_minV=0;//全局變量intmax(intx,inty){ g_minV=x<y?x:y; return(x>y?x:y);}intg_maxV;//全局變量voidmain(){ intx=6,y=9; maxV=max(x,y); printf("Themaxvalue:%d",g_maxV); printf("Theminvalue:%d",g_minV);}C語言程序設(shè)計(jì)@SoochowUniversity50形參實(shí)參|-----------||||-----------||棧||-----------|||||/|\|||||||-----------||堆||-----------||未初始化||-----------||初始化||-----------||正文段||||-----------|正文段codeg_minV……..g_maxV……..堆x=6y=9………..x=6y=9main()max()形參實(shí)參初始化未初始化程序段動(dòng)態(tài)存儲(chǔ)區(qū)靜態(tài)存儲(chǔ)區(qū)程序區(qū)C程序的內(nèi)存布局//file.cC語言程序設(shè)計(jì)@Soocho函數(shù)調(diào)用機(jī)制函數(shù)調(diào)用過程建立被調(diào)函數(shù)的??臻g保護(hù)調(diào)用函數(shù)的運(yùn)行狀態(tài)和返回地址目的是保護(hù)好現(xiàn)場環(huán)境,以便函數(shù)調(diào)用完成后,能夠返回到調(diào)用函數(shù)前程序運(yùn)行的正確狀態(tài)傳遞參數(shù)傳遞的參數(shù)是放在??臻g中的,當(dāng)函數(shù)調(diào)用完成,棧空間就會(huì)釋放掉,所以默認(rèn)情況下,傳遞的參數(shù)是按值傳遞的(也就是形參對實(shí)參進(jìn)行值拷貝,形參和實(shí)參在內(nèi)存中其實(shí)是兩個(gè)完全不同的地址空間,只是二者的數(shù)值相同)將控制權(quán)轉(zhuǎn)交被調(diào)用函數(shù)被調(diào)用函數(shù)按照程序員預(yù)先編好的指令(代碼)開始執(zhí)行C語言程序設(shè)計(jì)@SoochowUniversity51函數(shù)調(diào)用機(jī)制函數(shù)調(diào)用過程C語言程序設(shè)計(jì)@SoochowUn動(dòng)態(tài)存儲(chǔ)方式與靜態(tài)存儲(chǔ)方式存儲(chǔ)類別數(shù)據(jù)在內(nèi)存中存儲(chǔ)的方法兩大類:靜態(tài)存儲(chǔ)類和動(dòng)態(tài)存儲(chǔ)類。具體包含四種:自動(dòng)的(auto),靜態(tài)的(static),寄存器的(register),外部的(extern)根據(jù)變量的存儲(chǔ)類別,可以知道變量的作用域和生存期。C語言程序設(shè)計(jì)@SoochowUniversity52動(dòng)態(tài)存儲(chǔ)方式與靜態(tài)存儲(chǔ)方式存儲(chǔ)類別C語言程序設(shè)計(jì)@Sooch

auto變量自動(dòng)變量:存儲(chǔ)在動(dòng)態(tài)存儲(chǔ)區(qū)的變量函數(shù)中的局部變量(包括函數(shù)形參),如不專門聲明為static存儲(chǔ)類別,都是動(dòng)態(tài)地分配存儲(chǔ)空間的。自動(dòng)變量用關(guān)鍵字auto作存儲(chǔ)類別的聲明。而且auto關(guān)鍵字可以省略.C語言程序設(shè)計(jì)@SoochowUniversity53例如:

intf(inta)/*定義f函數(shù),a為形參*/{

autointb,c=3;/*定義b、c為自動(dòng)變量*/…

}auto變量自動(dòng)變量:C語言程序設(shè)計(jì)@SoochowUn用static聲明局部變量靜態(tài)局部變量有時(shí)希望函數(shù)中的局部變量的值在函數(shù)調(diào)用結(jié)束后不消失而保留原值,即其占用的存儲(chǔ)單元不釋放,在下一次該函數(shù)調(diào)用時(shí),該變量已有值,就是上一次函數(shù)調(diào)用結(jié)束時(shí)的值,這時(shí)就應(yīng)該指定該局部變量為“靜態(tài)局部變量”。靜態(tài)局部變量用關(guān)鍵字static進(jìn)行聲明例如:staticinta=3;C語言程序設(shè)計(jì)@SoochowUniversity54用static聲明局部變量靜態(tài)局部變量C語言程序設(shè)計(jì)@Soo靜態(tài)變量

f(inta) { autointb=0;

staticintc=3;

b=b+1;

c=c+1;

return(a+b+c); }

main(){ inta=2,i;

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

printf("%d",f(a));}C語言程序設(shè)計(jì)@SoochowUniversity55運(yùn)行結(jié)果為: 7

8

9靜態(tài)變量 f(inta)C語言程序設(shè)計(jì)@SoochowU對靜態(tài)局部變量的說明(1)生存期靜態(tài)局部變量屬于靜態(tài)存儲(chǔ)類別,在靜態(tài)存儲(chǔ)區(qū)內(nèi)分配存儲(chǔ)單元。在程序整個(gè)運(yùn)行期間都不釋放。自動(dòng)變量(即動(dòng)態(tài)局部變量)屬于動(dòng)態(tài)存儲(chǔ)類別,占動(dòng)態(tài)存儲(chǔ)區(qū)空間而不占靜態(tài)存儲(chǔ)區(qū)空間,函數(shù)調(diào)用結(jié)束后即釋放。(2)初始化靜態(tài)局部變量是在編譯時(shí)初始化的,即只初始化一次,在程序運(yùn)行時(shí)它已有初值。以后每次調(diào)用函數(shù)時(shí)不再重新賦初值而只是保留上次函數(shù)調(diào)用結(jié)束時(shí)的值。自動(dòng)變量初始化不是在編譯時(shí)進(jìn)行的,而是在函數(shù)調(diào)用時(shí)進(jìn)行,每調(diào)用一次函數(shù)重新給一次初值,相當(dāng)于執(zhí)行一次賦值語句。C語言程序設(shè)計(jì)@SoochowUniversity56對靜態(tài)局部變量的說明(1)生存期C語言程序設(shè)計(jì)@Sooch對靜態(tài)局部變量的說明(3)默認(rèn)值:(在定義局部變量時(shí)不初始化)靜態(tài)局部變量在編譯時(shí)自動(dòng)賦初值0(對數(shù)值型變量)或空字符(對字符變量)。自動(dòng)變量的值是一個(gè)不確定的值。這是由于每次函數(shù)調(diào)用結(jié)束后存儲(chǔ)單元已釋放,下次調(diào)用時(shí)又重新另分配存儲(chǔ)單元,而所分配的單元中的值是不確定的。(4)作用域雖然靜態(tài)局部變量在函數(shù)調(diào)用結(jié)束后仍然存在,但其他函數(shù)是不能引用它的,也就是說作用域?qū)儆诙x變量的函數(shù)。(這是和全局變量的區(qū)別)自動(dòng)變量的作用域是屬于定義變量的函數(shù)。C語言程序設(shè)計(jì)@SoochowUniversity57對靜態(tài)局部變量的說明(3)默認(rèn)值:(在定義局部變量時(shí)不初需用靜態(tài)局部變量的幾種情況(1)需要保留函數(shù)上一次調(diào)用結(jié)束時(shí)的值。C語言程序設(shè)計(jì)@SoochowUniversity58intfac(intn){staticintf=1;

f=f*n;

return(f);}main(){inti;

for(i=1;i<=5;i++)

printf(“%d!=%d”,i,fac(i));

printf(“\n”);}運(yùn)行結(jié)果為:1?。?2?。?3?。?4!=245?。?20需用靜態(tài)局部變量的幾種情況(1)需要保留函數(shù)上一次調(diào)用結(jié)束需用靜態(tài)局部變量的幾種情況(2)如果初始化后,變量只被引用而不改變其值,這時(shí)用靜態(tài)局部變量比較方便,以免每次調(diào)用時(shí)重新賦值。靜態(tài)局部變量的缺點(diǎn)用靜態(tài)存儲(chǔ)要多占內(nèi)存(長期占用不釋放,而不能像動(dòng)態(tài)存儲(chǔ)那樣一個(gè)存儲(chǔ)單元可供多個(gè)變量使用,節(jié)約內(nèi)存),而且降低了程序的可讀性,當(dāng)調(diào)用次數(shù)多時(shí)往往弄不清靜態(tài)局部變量的當(dāng)前值是什么。因此,如不必要,不要多用靜態(tài)局部變量。C語言程序設(shè)計(jì)@SoochowUniversity59需用靜態(tài)局部變量的幾種情況(2)如果初始化后,變量只被引用register變量一般情況下的變量存儲(chǔ)及運(yùn)算過程使用頻繁的變量的特殊使用方法:寄存器變量C語言允許將局部變量的值放在CPU的寄存器中存放在CPU寄存器中的變量叫做“寄存器變量”,用關(guān)鍵字register作聲明。C語言程序設(shè)計(jì)@SoochowUniversity60register變量一般情況下的變量存儲(chǔ)及運(yùn)算過程C語言程序例如

intfac(intn) {registerinti,f=1;/*定義寄存器變量*/

for(i=1;i<=n;i++)

f=f*i;

return(f); }

main(){ inti;

for(i=1;i<=5;i++)

printf(“%d?。剑\n”,i,fac(i));

}C語言程序設(shè)計(jì)@SoochowUniversity61例如 intfac(intn)C語言程序設(shè)計(jì)@Sooc有關(guān)寄存器變量說明(1)只有局部自動(dòng)變量和形式參數(shù)可以作為寄存器變量,其他(如全局變量)不行。在調(diào)用一個(gè)函數(shù)時(shí)占用一些寄存器以存放寄存器變量的值,函數(shù)調(diào)用結(jié)束釋放寄存器。此后,在調(diào)用另一個(gè)函數(shù)時(shí)又可以利用它來存放該函數(shù)的寄存器變量。(2)一個(gè)計(jì)算機(jī)系統(tǒng)中的寄存器數(shù)目是有限的,不能定義任意多個(gè)寄存器變量。(3)局部靜態(tài)變量不能定義為寄存器變量。不能寫成registerstaticinta,b,c;不能把變量a、b、c既放在靜態(tài)存儲(chǔ)區(qū)中,又放在寄存器中,二者只能居其一。對一個(gè)變量只能聲明為一個(gè)存儲(chǔ)類別。C語言程序設(shè)計(jì)@SoochowUniversity62有關(guān)寄存器變量說明(1)只有局部自動(dòng)變量和形式參數(shù)可以作為用extern聲明外部變量外部變量(即全局變量)的作用域的規(guī)定:它的作用域?yàn)閺淖兞康亩x處開始,到本程序文件的末尾。在此作用域內(nèi),全局變量可以為程序中各個(gè)函數(shù)所引用。編譯時(shí)將外部變量分配在靜態(tài)存儲(chǔ)區(qū)。外部變量(即全局變量)的作用域的擴(kuò)展:有時(shí)需要用extern來聲明外部變量,以擴(kuò)展外部變量的作用域C語言程序設(shè)計(jì)@SoochowUniversity63用extern聲明外部變量外部變量(即全局變量)的作用域的規(guī)用extern聲明外部變量1.在一個(gè)文件內(nèi)聲明外部變量如果外部變量不在文件的開頭定義,其有效的作用范圍只限于從定義處開始處起到文件終了的區(qū)域。如果在定義點(diǎn)之前的函數(shù)想引用該外部變量,則應(yīng)該在引用之前用關(guān)鍵字extern對該變量作“外部變量聲明”。表示該變量是一個(gè)已經(jīng)定義的外部變量。有了此聲明,就可以從“聲明”處起,合法地使用該外部變量。C語言程序設(shè)計(jì)@SoochowUniversity64用extern聲明外部變量1.在一個(gè)文件內(nèi)聲明外部變量C語言例如//file.c

intmax(intx,inty){/*定義max函數(shù)*/

return(x>y?x∶y);

} main()

{ externA,B;/*外部變量聲明*/ printf("%d",max(A,B));

} intA=13,B=-8;/*定義外部變量*/C語言程序設(shè)計(jì)@SoochowUniversity65用extern聲明外部變量時(shí),類型名可以寫也可以省寫。例如上例中的“externintA;”也可以寫成:“externA;”。例如//file.c C語言程序設(shè)計(jì)@SoochowUni用extern聲明外部變量2.在多文件的程序中聲明外部變量多文件的程序結(jié)構(gòu)中一個(gè)文件要使用另一個(gè)文件中定義的外部變量如果一個(gè)程序包含兩個(gè)文件,在兩個(gè)文件中都要用到同一個(gè)外部變量Num,不能分別在兩個(gè)文件中各自定義一個(gè)外部變量Num,否則在進(jìn)行程序的連接時(shí)會(huì)出現(xiàn)“重復(fù)定義”的錯(cuò)誤。多文件的程序結(jié)構(gòu)中外部變量引用的正確的做法:在任一個(gè)文件中定義外部變量Num,而在其他文件中用extern對Num作“外部變量聲明”。即externNum;在編譯和連接時(shí),系統(tǒng)會(huì)由此知道Num是一個(gè)已在別處定義的外部變量,并將在另一文件中定義的外部變量的作用域擴(kuò)展到本文件,在本文件中可以合法地引用外部變量Num。C語言程序設(shè)計(jì)@SoochowUniversity66用extern聲明外部變量2.在多文件的程序中聲明外部變量C多文件程序?qū)嵗胑xtern將外部變量的作用域擴(kuò)展到其他文件。本程序的作用是給定b的值,輸入a和m,求a×b和am的值。 文件file1.c中的內(nèi)容為:

intA;/*定義外部變量*/ main(){ intpower(int);/*對調(diào)用函數(shù)作聲明*/ intb=3,c,d,m;

printf(“enterthenumberaanditspowerm:\n”); scanf("%d,%d",&A,&m);

c=A*b;

printf("%d**%d=%d\n",A,b,c);

d=power(m);

printf(“%d*%d=%d”,A,m,d);}C語言程序設(shè)計(jì)@SoochowUniversity67文件file2.c中的內(nèi)容為:externA;/*聲明A為一個(gè)已定義的外部變量*/power(intn){inti,y=1;

for(i=1;i<=n;i++)

y*=A;

return(y);}多文件程序?qū)嵗胑xtern將外部變量的作用域擴(kuò)展到用extern聲明外部變量多文件中外部變量聲明的注意事項(xiàng):用這樣的全局變量應(yīng)十分慎重,因?yàn)樵趫?zhí)行一個(gè)文件中的函數(shù)時(shí),可能會(huì)改變了該全局變量的值,它會(huì)影響到另一文件中的函數(shù)執(zhí)行結(jié)果。多文件中外部變量聲明的深入理解:先在本文件中找外部變量的定義,如果找到,就在本文件中擴(kuò)展作用域。如果找不到,就在連接時(shí)從其他文件中找外部變量的定義,如果找到,就將作用域擴(kuò)展到本文件。如果找不到,按出錯(cuò)處理。C語言程序設(shè)計(jì)@SoochowUniversity68用extern聲明外部變量多文件中外部變量聲明的注意事項(xiàng):C用static聲明外部變量static聲明的含義:有時(shí)在程序設(shè)計(jì)中希望某些外部變量只限于被本文件引用,而不能被其他文件引用。這時(shí)可以在定義外部變量時(shí)加一個(gè)static聲明。C語言程序設(shè)計(jì)@SoochowUniversity69這里的extern聲明是無效的file1.cfile2.cstaticintA;externintA;main()fun(intn){{….…}A=A*n;…}用static聲明外部變量static聲明的含義:有時(shí)在程序用static聲明外部變量靜態(tài)外部變量用static聲明、只能用于本文件的外部變量(全局變量)稱為靜態(tài)外部變量。在程序設(shè)計(jì)中,常由若干人分別完成各個(gè)模塊,各人可以獨(dú)立地在其設(shè)計(jì)的文件中使用相同的外部變量名而互不相干。只需在每個(gè)文件中的外部變量前加上static即可。這就為程序的模塊化、通用性提供方便。如果已知道其他文件不引用本文件的外部變量,可以對本文件中的外部變量都加上static,成為靜態(tài)外部變量,以免被其他文件誤用。重要理解:需要指出對外部變量加static聲明,并不意味著這時(shí)才是靜態(tài)存儲(chǔ)(存放在靜態(tài)存儲(chǔ)區(qū)中),而不加static的是動(dòng)態(tài)存儲(chǔ)(存放在動(dòng)態(tài)存儲(chǔ)區(qū))。兩種形式的外部變量都是靜態(tài)存儲(chǔ)方式,只是作用范圍不同而已,都是在編譯時(shí)分配內(nèi)存的。C語言程序設(shè)計(jì)@SoochowUniversity70用static聲明外部變量靜態(tài)外部變量C語言程序設(shè)計(jì)@Soo關(guān)于變量的聲明和定義函數(shù)的聲明和定義的明顯區(qū)別:函數(shù)的聲明是函數(shù)的原型,而函數(shù)的定義是函數(shù)的本身。其實(shí)聲明就是通知編譯器函數(shù)的類型,參數(shù)的類型,返回值類型等;而定義是實(shí)實(shí)在在的分配內(nèi)存空間。同理,變量的聲明和定義也是一樣變量的定義和聲明之間的區(qū)別不是特別明顯:定義性聲明:需要建立存儲(chǔ)空間的變量聲明(如:inta;)引用性聲明:不需要建立存儲(chǔ)空間的聲明(如:externa;)。C語言程序設(shè)計(jì)@SoochowUniversity71關(guān)于變量的聲明和定義函數(shù)的聲明和定義的明顯區(qū)別:C語言程序設(shè)關(guān)于變量的聲明和定義廣義地說,聲明包括定義,但并非所有的聲明都是定義。對“inta;”

而言,它既是聲明,又是定義。而對“externa;”

而言,它是聲明而不是定義。一般為了敘述方便,把建立存儲(chǔ)空間的聲明稱定義,而把不需要建立存儲(chǔ)空間的聲明稱為聲明。顯然這里指的聲明是狹義的,即非定義性聲明。C語言程序設(shè)計(jì)@SoochowUniversity72

main(){externA;/*是聲明不是定義。聲明A是一個(gè)已定義的外部變量*/…}intA;/*是定義,定義A為整型外部變量*/關(guān)于變量的聲明和定義廣義地說,聲明包括定義,但并非所有的聲明關(guān)于變量的聲明和定義外部變量定義和外部變量聲明的含義是不同的外部變量的定義只能有一次,它的位置在所有函數(shù)之外,而同一文件中的外部變量的聲明可以有多次,它的位置可以在函數(shù)之內(nèi)(哪個(gè)函數(shù)要用就在哪個(gè)函數(shù)中聲明)也可以在函數(shù)之外(在外部變量的定義點(diǎn)之前)。變量的extern聲明只用作聲明,而不用于定義。變量的static聲明(1)對局部變量用static聲明,則為該變量分配的空間在整個(gè)程序執(zhí)行期間始終存在。(2)全局變量用static聲明,則該變量的作用域只限于本文件模塊(即被聲明的文件中)。某些聲明不能單獨(dú)進(jìn)行用auto、register、static聲明變量時(shí),是在定義變量的基礎(chǔ)上加上這些關(guān)鍵字,而不能單獨(dú)使用。C語言程序設(shè)計(jì)@SoochowUniversity73關(guān)于變量的聲明和定義外部變量定義和外部變量聲明的含義是不同的存儲(chǔ)類別小結(jié)對一個(gè)數(shù)據(jù)的定義,需要指定兩種屬性:數(shù)據(jù)類型和存儲(chǔ)類別,分別使用兩個(gè)關(guān)鍵字。如:staticinta;(靜態(tài)內(nèi)部整型變量或靜態(tài)外部整型變量)autocharc;(自動(dòng)變量,在函數(shù)內(nèi)定義)用extern聲明變量為已定義的外部變量,如:externb;(聲明b是一個(gè)已被定義的外部變量)C語言程序設(shè)計(jì)@SoochowUniversity74存儲(chǔ)類別小結(jié)對一個(gè)數(shù)據(jù)的定義,需要指定兩種屬性:數(shù)據(jù)類型和存從不同角度做歸納(1)從作用域角度分,有局部變量和全局變量。(2)從變量存在的時(shí)間來區(qū)分,有動(dòng)態(tài)存儲(chǔ)和靜態(tài)存儲(chǔ)兩種類型。(3)從變量值存放的位置來區(qū)分,可分為:內(nèi)存中靜態(tài)存儲(chǔ)區(qū)中存放;內(nèi)存中動(dòng)態(tài)存儲(chǔ)區(qū)中存放;CPU中的寄存器中存放。(4)關(guān)于作用域和生存期的概念。(5)static對局部變量和全局變量的作用不同。詳細(xì)的請參考原書內(nèi)容C語言程序設(shè)計(jì)@SoochowUniversity75從不同角度做歸納(1)從作用域角度分,有局部變量和全局變量內(nèi)部函數(shù)和外部函數(shù)基本概念

函數(shù)本質(zhì)上是全局的,因?yàn)橐粋€(gè)函數(shù)要被另外的函數(shù)調(diào)用,但是,也可以指定函數(shù)不能被其他文件調(diào)用。根據(jù)函數(shù)能否被其他源文件調(diào)用,將函數(shù)區(qū)分為內(nèi)部函數(shù)和外部函數(shù)。內(nèi)部函數(shù)內(nèi)部函數(shù)的概念:如果一個(gè)函數(shù)只能被本文件中其他函數(shù)所調(diào)用,它稱為內(nèi)部函數(shù)。內(nèi)部函數(shù)定義方法在定義內(nèi)部函數(shù)時(shí),在函數(shù)名和函數(shù)類型的前面加static。即static類型標(biāo)識(shí)符函數(shù)名(形參表)如staticintfun(inta,intb)內(nèi)部函數(shù)又稱靜態(tài)函數(shù)。使用內(nèi)部函數(shù),可以使函數(shù)只局限于所在文件,如果在不同的文件中有同名的內(nèi)部函數(shù),互不干擾。這樣不同的人可以分別編寫不同的函數(shù),而不必?fù)?dān)心所用函數(shù)是否會(huì)與其他文件中函數(shù)同名通常把只能由同一文件使用的函數(shù)和外部變量放在一個(gè)文件中,在它們前面都冠以static使之局部化,其他文件不能引用。C語言程序設(shè)計(jì)@SoochowUniversity76內(nèi)部函數(shù)和外部函數(shù)基本概念C語言程序設(shè)計(jì)@Soocho外部函數(shù)(1)在定義函數(shù)時(shí),如果在函數(shù)首部的最左端冠以關(guān)鍵字extern,則表示此函數(shù)是外部函數(shù),可供其他文件調(diào)用。如函數(shù)首部可以寫為

externintfun(inta,intb)

注意:C語言規(guī)定,如果在定義函數(shù)時(shí)省略extern,則隱含為外部函數(shù)。本書前面所用的函數(shù)都是外部函數(shù)。(2)在需要調(diào)用此函數(shù)的文件中,用extern聲明所用的函數(shù)是外部函數(shù)。 例。有一個(gè)字符串,內(nèi)有若干個(gè)字符,

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(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ǔ)空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論