版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領
文檔簡介
C語言程序設計周經(jīng)亞jy_zhou@計算機科學與技術學院C語言程序設計周經(jīng)亞作用域含義:
變量作用域是指該變量可以被訪問的代碼段范圍根據(jù)作用域劃分變量:
1、局部變量: 在某個函數(shù)內(nèi)部(包括main)定義,隸屬于該函數(shù);作用范圍為定義點到所屬函數(shù)結(jié)束;
2、全局變量: 在函數(shù)(包括main)外部定義,不屬于任何函數(shù); 作用范圍為定義點到本源文件的結(jié)束,為本文件中其他函數(shù)所共用;C語言程序設計@SoochowUniversity2第7章用函數(shù)實現(xiàn)模塊化程序設計-II作用域含義:C語言程序設計@SoochowUniversi全局/局部變量的注意點1)函數(shù)的形參是局部變量;2)復合語句中可定義變量; 例如:if(a>b) { inttemp; temp=a; a=b; b=temp;}3)不同函數(shù)中可以使用同名的局部變量,不同代碼段中使用的同名變量的含義不同;4)全局變量與局部變量同名時,局部變量優(yōu)先級高于全局變量;例如:C語言程序設計@SoochowUniversity3全局/局部變量的注意點1)函數(shù)的形參是局部變量;C語言程序設例如:intp=1,q=5;floatf1(inta){ intb,c; ……}charc1;charf2(intx,inty){ intb,j; ……}main(){ intp,c1; ……}C語言程序設計@SoochowUniversity4main()里看到的是局部變量p例如:intp=1,q=5;C語言程序設計@Soochow全局變量的說明全局變量的優(yōu)點:全局變量的作用是增加了函數(shù)間數(shù)據(jù)聯(lián)系的渠道命名慣例:例如:intg_num;全局變量的缺點:全局變量在程序的全部執(zhí)行過程中都占用存儲單元,而不是僅在需要時才開辟單元它使函數(shù)的通用性降低了,因為函數(shù)在執(zhí)行時要依賴于其所在的外部變量。不符合:在程序設計中,在劃分模塊時要求模塊的“內(nèi)聚性”強、與其他模塊的“耦合性”弱的原則使用全局變量過多,會降低程序的清晰性,人們往往難以清楚地判斷出每個瞬時各個外部變量的值建議:在程序中盡量限制使用全局變量!??!C語言程序設計@SoochowUniversity5全局變量的說明全局變量的優(yōu)點:C語言程序設計@Soochow變量的存儲類別從變量的作用域(即從空間)角度來分,可以分為全局變量和局部變量。從變量值存在的時間(即生存期)角度來分,可以分為靜態(tài)存儲方式和動態(tài)存儲方式。靜態(tài)存儲方式是指在程序運行期間分配固定的存儲空間的方式。動態(tài)存儲方式則是在程序運行期間根據(jù)需要進行動態(tài)的分配存儲空間的方式。C語言程序設計@SoochowUniversity6變量的存儲類別從變量的作用域(即從空間)角度來分,可以分為全C程序的內(nèi)存布局C程序一直由下列部分組成:1)正文段——CPU執(zhí)行的機器指令部分;一個程序只有一個副本;只讀,防止程序由于意外事故而修改自身指令;2)初始化數(shù)據(jù)段(數(shù)據(jù)段)——在程序中所有賦了初值的全局變量,存放在這里。3)非初始化數(shù)據(jù)段(bss段)——在程序中沒有初始化的全局變量;內(nèi)核將此段初始化為0。4)?!鲩L方向:自頂向下增長;自動變量以及每次函數(shù)調(diào)用時所需要保存的信息(返回地址;環(huán)境信息)。5)堆——動態(tài)存儲分配。|-----------|(后面會講到的指針類型,它分配的內(nèi)存空間就是在堆上)C語言程序設計@SoochowUniversity7|-----------||||-----------||棧||-----------|||||/|\|||||-----------||堆||-----------||未初始化||-----------||初始化||-----------||正文段||-----------|C程序的內(nèi)存布局C程序一直由下列部分組成:C語言程序設計@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語言程序設計@SoochowUniversity8形參實參|-----------||||-----------||棧||-----------|||||/|\|||||||-----------||堆||-----------||未初始化||-----------||初始化||-----------||正文段||||-----------|正文段codeg_minV……..g_maxV……..堆x=6y=9………..x=6y=9main()max()形參實參初始化未初始化程序段動態(tài)存儲區(qū)靜態(tài)存儲區(qū)程序區(qū)C程序的內(nèi)存布局//file.cC語言程序設計@Soocho函數(shù)調(diào)用機制函數(shù)調(diào)用過程建立被調(diào)函數(shù)的棧空間保護調(diào)用函數(shù)的運行狀態(tài)和返回地址目的是保護好現(xiàn)場環(huán)境,以便函數(shù)調(diào)用完成后,能夠返回到調(diào)用函數(shù)前程序運行的正確狀態(tài)傳遞參數(shù)傳遞的參數(shù)是放在??臻g中的,當函數(shù)調(diào)用完成,??臻g就會釋放掉,所以默認情況下,傳遞的參數(shù)是按值傳遞的(也就是形參對實參進行值拷貝,形參和實參在內(nèi)存中其實是兩個完全不同的地址空間,只是二者的數(shù)值相同)將控制權(quán)轉(zhuǎn)交被調(diào)用函數(shù)被調(diào)用函數(shù)按照程序員預先編好的指令(代碼)開始執(zhí)行C語言程序設計@SoochowUniversity9函數(shù)調(diào)用機制函數(shù)調(diào)用過程C語言程序設計@SoochowUn動態(tài)存儲方式與靜態(tài)存儲方式存儲類別數(shù)據(jù)在內(nèi)存中存儲的方法兩大類:靜態(tài)存儲類和動態(tài)存儲類。具體包含四種:自動的(auto),靜態(tài)的(static),寄存器的(register),外部的(extern)根據(jù)變量的存儲類別,可以知道變量的作用域和生存期。C語言程序設計@SoochowUniversity10動態(tài)存儲方式與靜態(tài)存儲方式存儲類別C語言程序設計@Sooch
auto變量自動變量:存儲在動態(tài)存儲區(qū)的變量函數(shù)中的局部變量(包括函數(shù)形參),如不專門聲明為static存儲類別,都是動態(tài)地分配存儲空間的。自動變量用關鍵字auto作存儲類別的聲明。而且auto關鍵字可以省略.C語言程序設計@SoochowUniversity11例如:
intf(inta)/*定義f函數(shù),a為形參*/{
autointb,c=3;/*定義b、c為自動變量*/…
}auto變量自動變量:C語言程序設計@SoochowUn用static聲明局部變量靜態(tài)局部變量有時希望函數(shù)中的局部變量的值在函數(shù)調(diào)用結(jié)束后不消失而保留原值,即其占用的存儲單元不釋放,在下一次該函數(shù)調(diào)用時,該變量已有值,就是上一次函數(shù)調(diào)用結(jié)束時的值,這時就應該指定該局部變量為“靜態(tài)局部變量”。靜態(tài)局部變量用關鍵字static進行聲明例如:staticinta=3;C語言程序設計@SoochowUniversity12用static聲明局部變量靜態(tài)局部變量C語言程序設計@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語言程序設計@SoochowUniversity13運行結(jié)果為: 7
8
9靜態(tài)變量 f(inta)C語言程序設計@SoochowU對靜態(tài)局部變量的說明(1)生存期靜態(tài)局部變量屬于靜態(tài)存儲類別,在靜態(tài)存儲區(qū)內(nèi)分配存儲單元。在程序整個運行期間都不釋放。自動變量(即動態(tài)局部變量)屬于動態(tài)存儲類別,占動態(tài)存儲區(qū)空間而不占靜態(tài)存儲區(qū)空間,函數(shù)調(diào)用結(jié)束后即釋放。(2)初始化靜態(tài)局部變量是在編譯時初始化的,即只初始化一次,在程序運行時它已有初值。以后每次調(diào)用函數(shù)時不再重新賦初值而只是保留上次函數(shù)調(diào)用結(jié)束時的值。自動變量初始化不是在編譯時進行的,而是在函數(shù)調(diào)用時進行,每調(diào)用一次函數(shù)重新給一次初值,相當于執(zhí)行一次賦值語句。C語言程序設計@SoochowUniversity14對靜態(tài)局部變量的說明(1)生存期C語言程序設計@Sooch對靜態(tài)局部變量的說明(3)默認值:(在定義局部變量時不初始化)靜態(tài)局部變量在編譯時自動賦初值0(對數(shù)值型變量)或空字符(對字符變量)。自動變量的值是一個不確定的值。這是由于每次函數(shù)調(diào)用結(jié)束后存儲單元已釋放,下次調(diào)用時又重新另分配存儲單元,而所分配的單元中的值是不確定的。(4)作用域雖然靜態(tài)局部變量在函數(shù)調(diào)用結(jié)束后仍然存在,但其他函數(shù)是不能引用它的,也就是說作用域?qū)儆诙x變量的函數(shù)。(這是和全局變量的區(qū)別)自動變量的作用域是屬于定義變量的函數(shù)。C語言程序設計@SoochowUniversity15對靜態(tài)局部變量的說明(3)默認值:(在定義局部變量時不初需用靜態(tài)局部變量的幾種情況(1)需要保留函數(shù)上一次調(diào)用結(jié)束時的值。C語言程序設計@SoochowUniversity16intfac(intn){staticintf=1;
f=f*n;
return(f);}main(){inti;
for(i=1;i<=5;i++)
printf(“%d?。剑”,i,fac(i));
printf(“\n”);}運行結(jié)果為:1!=12?。?3?。?4?。?45?。?20需用靜態(tài)局部變量的幾種情況(1)需要保留函數(shù)上一次調(diào)用結(jié)束需用靜態(tài)局部變量的幾種情況(2)如果初始化后,變量只被引用而不改變其值,這時用靜態(tài)局部變量比較方便,以免每次調(diào)用時重新賦值。靜態(tài)局部變量的缺點用靜態(tài)存儲要多占內(nèi)存(長期占用不釋放,而不能像動態(tài)存儲那樣一個存儲單元可供多個變量使用,節(jié)約內(nèi)存),而且降低了程序的可讀性,當調(diào)用次數(shù)多時往往弄不清靜態(tài)局部變量的當前值是什么。因此,如不必要,不要多用靜態(tài)局部變量。C語言程序設計@SoochowUniversity17需用靜態(tài)局部變量的幾種情況(2)如果初始化后,變量只被引用register變量一般情況下的變量存儲及運算過程使用頻繁的變量的特殊使用方法:寄存器變量C語言允許將局部變量的值放在CPU的寄存器中存放在CPU寄存器中的變量叫做“寄存器變量”,用關鍵字register作聲明。C語言程序設計@SoochowUniversity18register變量一般情況下的變量存儲及運算過程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語言程序設計@SoochowUniversity19例如 intfac(intn)C語言程序設計@Sooc有關寄存器變量說明(1)只有局部自動變量和形式參數(shù)可以作為寄存器變量,其他(如全局變量)不行。在調(diào)用一個函數(shù)時占用一些寄存器以存放寄存器變量的值,函數(shù)調(diào)用結(jié)束釋放寄存器。此后,在調(diào)用另一個函數(shù)時又可以利用它來存放該函數(shù)的寄存器變量。(2)一個計算機系統(tǒng)中的寄存器數(shù)目是有限的,不能定義任意多個寄存器變量。(3)局部靜態(tài)變量不能定義為寄存器變量。不能寫成registerstaticinta,b,c;不能把變量a、b、c既放在靜態(tài)存儲區(qū)中,又放在寄存器中,二者只能居其一。對一個變量只能聲明為一個存儲類別。C語言程序設計@SoochowUniversity20有關寄存器變量說明(1)只有局部自動變量和形式參數(shù)可以作為用extern聲明外部變量外部變量(即全局變量)的作用域的規(guī)定:它的作用域為從變量的定義處開始,到本程序文件的末尾。在此作用域內(nèi),全局變量可以為程序中各個函數(shù)所引用。編譯時將外部變量分配在靜態(tài)存儲區(qū)。外部變量(即全局變量)的作用域的擴展:有時需要用extern來聲明外部變量,以擴展外部變量的作用域C語言程序設計@SoochowUniversity21用extern聲明外部變量外部變量(即全局變量)的作用域的規(guī)用extern聲明外部變量1.在一個文件內(nèi)聲明外部變量如果外部變量不在文件的開頭定義,其有效的作用范圍只限于從定義處開始處起到文件終了的區(qū)域。如果在定義點之前的函數(shù)想引用該外部變量,則應該在引用之前用關鍵字extern對該變量作“外部變量聲明”。表示該變量是一個已經(jīng)定義的外部變量。有了此聲明,就可以從“聲明”處起,合法地使用該外部變量。C語言程序設計@SoochowUniversity22用extern聲明外部變量1.在一個文件內(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語言程序設計@SoochowUniversity23用extern聲明外部變量時,類型名可以寫也可以省寫。例如上例中的“externintA;”也可以寫成:“externA;”。例如//file.c C語言程序設計@SoochowUni用extern聲明外部變量2.在多文件的程序中聲明外部變量多文件的程序結(jié)構(gòu)中一個文件要使用另一個文件中定義的外部變量如果一個程序包含兩個文件,在兩個文件中都要用到同一個外部變量Num,不能分別在兩個文件中各自定義一個外部變量Num,否則在進行程序的連接時會出現(xiàn)“重復定義”的錯誤。多文件的程序結(jié)構(gòu)中外部變量引用的正確的做法:在任一個文件中定義外部變量Num,而在其他文件中用extern對Num作“外部變量聲明”。即externNum;在編譯和連接時,系統(tǒng)會由此知道Num是一個已在別處定義的外部變量,并將在另一文件中定義的外部變量的作用域擴展到本文件,在本文件中可以合法地引用外部變量Num。C語言程序設計@SoochowUniversity24用extern聲明外部變量2.在多文件的程序中聲明外部變量C多文件程序?qū)嵗胑xtern將外部變量的作用域擴展到其他文件。本程序的作用是給定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語言程序設計@SoochowUniversity25文件file2.c中的內(nèi)容為:externA;/*聲明A為一個已定義的外部變量*/power(intn){inti,y=1;
for(i=1;i<=n;i++)
y*=A;
return(y);}多文件程序?qū)嵗胑xtern將外部變量的作用域擴展到用extern聲明外部變量多文件中外部變量聲明的注意事項:用這樣的全局變量應十分慎重,因為在執(zhí)行一個文件中的函數(shù)時,可能會改變了該全局變量的值,它會影響到另一文件中的函數(shù)執(zhí)行結(jié)果。多文件中外部變量聲明的深入理解:先在本文件中找外部變量的定義,如果找到,就在本文件中擴展作用域。如果找不到,就在連接時從其他文件中找外部變量的定義,如果找到,就將作用域擴展到本文件。如果找不到,按出錯處理。C語言程序設計@SoochowUniversity26用extern聲明外部變量多文件中外部變量聲明的注意事項:C用static聲明外部變量static聲明的含義:有時在程序設計中希望某些外部變量只限于被本文件引用,而不能被其他文件引用。這時可以在定義外部變量時加一個static聲明。C語言程序設計@SoochowUniversity27這里的extern聲明是無效的file1.cfile2.cstaticintA;externintA;main()fun(intn){{….…}A=A*n;…}用static聲明外部變量static聲明的含義:有時在程序用static聲明外部變量靜態(tài)外部變量用static聲明、只能用于本文件的外部變量(全局變量)稱為靜態(tài)外部變量。在程序設計中,常由若干人分別完成各個模塊,各人可以獨立地在其設計的文件中使用相同的外部變量名而互不相干。只需在每個文件中的外部變量前加上static即可。這就為程序的模塊化、通用性提供方便。如果已知道其他文件不引用本文件的外部變量,可以對本文件中的外部變量都加上static,成為靜態(tài)外部變量,以免被其他文件誤用。重要理解:需要指出對外部變量加static聲明,并不意味著這時才是靜態(tài)存儲(存放在靜態(tài)存儲區(qū)中),而不加static的是動態(tài)存儲(存放在動態(tài)存儲區(qū))。兩種形式的外部變量都是靜態(tài)存儲方式,只是作用范圍不同而已,都是在編譯時分配內(nèi)存的。C語言程序設計@SoochowUniversity28用static聲明外部變量靜態(tài)外部變量C語言程序設計@Soo關于變量的聲明和定義函數(shù)的聲明和定義的明顯區(qū)別:函數(shù)的聲明是函數(shù)的原型,而函數(shù)的定義是函數(shù)的本身。其實聲明就是通知編譯器函數(shù)的類型,參數(shù)的類型,返回值類型等;而定義是實實在在的分配內(nèi)存空間。同理,變量的聲明和定義也是一樣變量的定義和聲明之間的區(qū)別不是特別明顯:定義性聲明:需要建立存儲空間的變量聲明(如:inta;)引用性聲明:不需要建立存儲空間的聲明(如:externa;)。C語言程序設計@SoochowUniversity29關于變量的聲明和定義函數(shù)的聲明和定義的明顯區(qū)別:C語言程序設關于變量的聲明和定義廣義地說,聲明包括定義,但并非所有的聲明都是定義。對“inta;”
而言,它既是聲明,又是定義。而對“externa;”
而言,它是聲明而不是定義。一般為了敘述方便,把建立存儲空間的聲明稱定義,而把不需要建立存儲空間的聲明稱為聲明。顯然這里指的聲明是狹義的,即非定義性聲明。C語言程序設計@SoochowUniversity30
main(){externA;/*是聲明不是定義。聲明A是一個已定義的外部變量*/…}intA;/*是定義,定義A為整型外部變量*/關于變量的聲明和定義廣義地說,聲明包括定義,但并非所有的聲明關于變量的聲明和定義外部變量定義和外部變量聲明的含義是不同的外部變量的定義只能有一次,它的位置在所有函數(shù)之外,而同一文件中的外部變量的聲明可以有多次,它的位置可以在函數(shù)之內(nèi)(哪個函數(shù)要用就在哪個函數(shù)中聲明)也可以在函數(shù)之外(在外部變量的定義點之前)。變量的extern聲明只用作聲明,而不用于定義。變量的static聲明(1)對局部變量用static聲明,則為該變量分配的空間在整個程序執(zhí)行期間始終存在。(2)全局變量用static聲明,則該變量的作用域只限于本文件模塊(即被聲明的文件中)。某些聲明不能單獨進行用auto、register、static聲明變量時,是在定義變量的基礎上加上這些關鍵字,而不能單獨使用。C語言程序設計@SoochowUniversity31關于變量的聲明和定義外部變量定義和外部變量聲明的含義是不同的存儲類別小結(jié)對一個數(shù)據(jù)的定義,需要指定兩種屬性:數(shù)據(jù)類型和存儲類別,分別使用兩個關鍵字。如:staticinta;(靜態(tài)內(nèi)部整型變量或靜態(tài)外部整型變量)autocharc;(自動變量,在函數(shù)內(nèi)定義)用extern聲明變量為已定義的外部變量,如:externb;(聲明b是一個已被定義的外部變量)C語言程序設計@SoochowUniversity32存儲類別小結(jié)對一個數(shù)據(jù)的定義,需要指定兩種屬性:數(shù)據(jù)類型和存從不同角度做歸納(1)從作用域角度分,有局部變量和全局變量。(2)從變量存在的時間來區(qū)分,有動態(tài)存儲和靜態(tài)存儲兩種類型。(3)從變量值存放的位置來區(qū)分,可分為:內(nèi)存中靜態(tài)存儲區(qū)中存放;內(nèi)存中動態(tài)存儲區(qū)中存放;CPU中的寄存器中存放。(4)關于作用域和生存期的概念。(5)static對局部變量和全局變量的作用不同。詳細的請參考原書內(nèi)容C語言程序設計@SoochowUniversity33從不同角度做歸納(1)從作用域角度分,有局部變量和全局變量內(nèi)部函數(shù)和外部函數(shù)基本概念
函數(shù)本質(zhì)上是全局的,因為一個函數(shù)要被另外的函數(shù)調(diào)用,但是,也可以指定函數(shù)不能被其他文件調(diào)用。根據(jù)函數(shù)能否被其他源文件調(diào)用,將函數(shù)區(qū)分為內(nèi)部函數(shù)和外部函數(shù)。內(nèi)部函數(shù)內(nèi)部函數(shù)的概念:如果一個函數(shù)只能被本文件中其他函數(shù)所調(diào)用,它稱為內(nèi)部函數(shù)。內(nèi)部函數(shù)定義方法在定義內(nèi)部函數(shù)時,在函數(shù)名和函數(shù)類型的前面加static。即static類型標識符函數(shù)名(形參表)如staticintfun(inta,intb)內(nèi)部函數(shù)又稱靜態(tài)函數(shù)。使用內(nèi)部函數(shù),可以使函數(shù)只局限于所在文件,如果在不同的文件中有同名的內(nèi)部函數(shù),互不干擾。這樣不同的人可以分別編寫不同的函數(shù),而不必擔心所用函數(shù)是否會與其他文件中函數(shù)同名通常把只能由同一文件使用的函數(shù)和外部變量放在一個文件中,在它們前面都冠以static使之局部化,其他文件不能引用。C語言程序設計@SoochowUniversity34內(nèi)部函數(shù)和外部函數(shù)基本概念C語言程序設計@Soocho外部函數(shù)(1)在定義函數(shù)時,如果在函數(shù)首部的最左端冠以關鍵字extern,則表示此函數(shù)是外部函數(shù),可供其他文件調(diào)用。如函數(shù)首部可以寫為
externintfun(inta,intb)
注意:C語言規(guī)定,如果在定義函數(shù)時省略extern,則隱含為外部函數(shù)。本書前面所用的函數(shù)都是外部函數(shù)。(2)在需要調(diào)用此函數(shù)的文件中,用extern聲明所用的函數(shù)是外部函數(shù)。 例。有一個字符串,內(nèi)有若干個字符,今輸入一個字符,要求程序?qū)⒆址性撟址麆h去。用外部函數(shù)實現(xiàn)。C語言程序設計@SoochowUniversity35外部函數(shù)(1)在定義函數(shù)時,如果在函數(shù)首部的最左端冠以關鍵多文件實例
file1.c(文件1)
externenter-string(charstr[80]);
externdelete-string(charstr[],charch);
externprint-string(charstr[]);
/*以上3行聲明在本函數(shù)中將要調(diào)用的在其他文件中定義的3個函數(shù)*/main(){ charc;
charstr[80];
enter-string(str);
scanf(“%c”,&c);
delete-string(str,c);
print-string(str); }C語言程序設計@SoochowUniversity36file2.c(文件2)#include<studio.h>enter-string(charstr[80]){gets(str);}/*讀入字符串str*/多文件實例 file1.c(文件1)C語言程序設多文件實例
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語言程序設計@SoochowUniversity37運行情況如下:abcdefgc(輸入str)c(輸入要刪去的字符)abdefg(輸出已刪去指定字符的字符串)多文件實例 file3.c(文件3)C語言程序設計@Sooc函數(shù)實例例題1:定義一個函數(shù)實現(xiàn)數(shù)組前后元素互換。如intary[5]={1,2,3,4,5}=>ary[5]={5,4,3,2,1}函數(shù)原型:voidconvertArray(intarray[],intn);C語言程序設計@SoochowUniversity38i<n/2i=0;temp=array[i];array[i]=array[n-i-1];array[n-i-1]=temp;i++Y結(jié)束函數(shù)實例例題1:C語言程序設計@SoochowUniver函數(shù)實例1C語言程序設計@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ù)實例1C語言程序設計@SoochowUniversit函數(shù)實例2設計一個函數(shù),實現(xiàn)字符串到double數(shù)據(jù)的轉(zhuǎn)換。要求不使用系統(tǒng)函數(shù)。用多文件形式實現(xiàn)C語言程序設計@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ù)實例2設計一個函數(shù),實現(xiàn)字符串到double數(shù)據(jù)的轉(zhuǎn)換。函數(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語言程序設計@SoochowUniversity41函數(shù)實例2//file2.cC語言程序設計@Soochow作業(yè)(與上次作業(yè)一起檢查)【基本函數(shù)設計、用地址傳遞參數(shù)】用隨機數(shù)來初始化一個整形數(shù)組,數(shù)組元素個數(shù)自定。編寫一個函數(shù),對數(shù)組進行排序。編寫一個函數(shù),在屏幕上輸出數(shù)組內(nèi)容,每行輸出5個元素。編寫主函數(shù),調(diào)用上述函數(shù)測試其功能?!净竞瘮?shù)設計或遞歸函數(shù)設計】從鍵盤輸入一個十進制正整數(shù),輸出這個整數(shù)的二進制形式。轉(zhuǎn)換過程用一個函數(shù)來完成。作業(yè)(與上次作業(yè)一起檢查)【基本函數(shù)設計、用地址傳遞參數(shù)】用C語言程序設計周經(jīng)亞jy_zhou@計算機科學與技術學院C語言程序設計周經(jīng)亞作用域含義:
變量作用域是指該變量可以被訪問的代碼段范圍根據(jù)作用域劃分變量:
1、局部變量: 在某個函數(shù)內(nèi)部(包括main)定義,隸屬于該函數(shù);作用范圍為定義點到所屬函數(shù)結(jié)束;
2、全局變量: 在函數(shù)(包括main)外部定義,不屬于任何函數(shù); 作用范圍為定義點到本源文件的結(jié)束,為本文件中其他函數(shù)所共用;C語言程序設計@SoochowUniversity44第7章用函數(shù)實現(xiàn)模塊化程序設計-II作用域含義:C語言程序設計@SoochowUniversi全局/局部變量的注意點1)函數(shù)的形參是局部變量;2)復合語句中可定義變量; 例如:if(a>b) { inttemp; temp=a; a=b; b=temp;}3)不同函數(shù)中可以使用同名的局部變量,不同代碼段中使用的同名變量的含義不同;4)全局變量與局部變量同名時,局部變量優(yōu)先級高于全局變量;例如:C語言程序設計@SoochowUniversity45全局/局部變量的注意點1)函數(shù)的形參是局部變量;C語言程序設例如:intp=1,q=5;floatf1(inta){ intb,c; ……}charc1;charf2(intx,inty){ intb,j; ……}main(){ intp,c1; ……}C語言程序設計@SoochowUniversity46main()里看到的是局部變量p例如:intp=1,q=5;C語言程序設計@Soochow全局變量的說明全局變量的優(yōu)點:全局變量的作用是增加了函數(shù)間數(shù)據(jù)聯(lián)系的渠道命名慣例:例如:intg_num;全局變量的缺點:全局變量在程序的全部執(zhí)行過程中都占用存儲單元,而不是僅在需要時才開辟單元它使函數(shù)的通用性降低了,因為函數(shù)在執(zhí)行時要依賴于其所在的外部變量。不符合:在程序設計中,在劃分模塊時要求模塊的“內(nèi)聚性”強、與其他模塊的“耦合性”弱的原則使用全局變量過多,會降低程序的清晰性,人們往往難以清楚地判斷出每個瞬時各個外部變量的值建議:在程序中盡量限制使用全局變量!?。語言程序設計@SoochowUniversity47全局變量的說明全局變量的優(yōu)點:C語言程序設計@Soochow變量的存儲類別從變量的作用域(即從空間)角度來分,可以分為全局變量和局部變量。從變量值存在的時間(即生存期)角度來分,可以分為靜態(tài)存儲方式和動態(tài)存儲方式。靜態(tài)存儲方式是指在程序運行期間分配固定的存儲空間的方式。動態(tài)存儲方式則是在程序運行期間根據(jù)需要進行動態(tài)的分配存儲空間的方式。C語言程序設計@SoochowUniversity48變量的存儲類別從變量的作用域(即從空間)角度來分,可以分為全C程序的內(nèi)存布局C程序一直由下列部分組成:1)正文段——CPU執(zhí)行的機器指令部分;一個程序只有一個副本;只讀,防止程序由于意外事故而修改自身指令;2)初始化數(shù)據(jù)段(數(shù)據(jù)段)——在程序中所有賦了初值的全局變量,存放在這里。3)非初始化數(shù)據(jù)段(bss段)——在程序中沒有初始化的全局變量;內(nèi)核將此段初始化為0。4)?!鲩L方向:自頂向下增長;自動變量以及每次函數(shù)調(diào)用時所需要保存的信息(返回地址;環(huán)境信息)。5)堆——動態(tài)存儲分配。|-----------|(后面會講到的指針類型,它分配的內(nèi)存空間就是在堆上)C語言程序設計@SoochowUniversity49|-----------||||-----------||棧||-----------|||||/|\|||||-----------||堆||-----------||未初始化||-----------||初始化||-----------||正文段||-----------|C程序的內(nèi)存布局C程序一直由下列部分組成:C語言程序設計@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語言程序設計@SoochowUniversity50形參實參|-----------||||-----------||棧||-----------|||||/|\|||||||-----------||堆||-----------||未初始化||-----------||初始化||-----------||正文段||||-----------|正文段codeg_minV……..g_maxV……..堆x=6y=9………..x=6y=9main()max()形參實參初始化未初始化程序段動態(tài)存儲區(qū)靜態(tài)存儲區(qū)程序區(qū)C程序的內(nèi)存布局//file.cC語言程序設計@Soocho函數(shù)調(diào)用機制函數(shù)調(diào)用過程建立被調(diào)函數(shù)的??臻g保護調(diào)用函數(shù)的運行狀態(tài)和返回地址目的是保護好現(xiàn)場環(huán)境,以便函數(shù)調(diào)用完成后,能夠返回到調(diào)用函數(shù)前程序運行的正確狀態(tài)傳遞參數(shù)傳遞的參數(shù)是放在??臻g中的,當函數(shù)調(diào)用完成,??臻g就會釋放掉,所以默認情況下,傳遞的參數(shù)是按值傳遞的(也就是形參對實參進行值拷貝,形參和實參在內(nèi)存中其實是兩個完全不同的地址空間,只是二者的數(shù)值相同)將控制權(quán)轉(zhuǎn)交被調(diào)用函數(shù)被調(diào)用函數(shù)按照程序員預先編好的指令(代碼)開始執(zhí)行C語言程序設計@SoochowUniversity51函數(shù)調(diào)用機制函數(shù)調(diào)用過程C語言程序設計@SoochowUn動態(tài)存儲方式與靜態(tài)存儲方式存儲類別數(shù)據(jù)在內(nèi)存中存儲的方法兩大類:靜態(tài)存儲類和動態(tài)存儲類。具體包含四種:自動的(auto),靜態(tài)的(static),寄存器的(register),外部的(extern)根據(jù)變量的存儲類別,可以知道變量的作用域和生存期。C語言程序設計@SoochowUniversity52動態(tài)存儲方式與靜態(tài)存儲方式存儲類別C語言程序設計@Sooch
auto變量自動變量:存儲在動態(tài)存儲區(qū)的變量函數(shù)中的局部變量(包括函數(shù)形參),如不專門聲明為static存儲類別,都是動態(tài)地分配存儲空間的。自動變量用關鍵字auto作存儲類別的聲明。而且auto關鍵字可以省略.C語言程序設計@SoochowUniversity53例如:
intf(inta)/*定義f函數(shù),a為形參*/{
autointb,c=3;/*定義b、c為自動變量*/…
}auto變量自動變量:C語言程序設計@SoochowUn用static聲明局部變量靜態(tài)局部變量有時希望函數(shù)中的局部變量的值在函數(shù)調(diào)用結(jié)束后不消失而保留原值,即其占用的存儲單元不釋放,在下一次該函數(shù)調(diào)用時,該變量已有值,就是上一次函數(shù)調(diào)用結(jié)束時的值,這時就應該指定該局部變量為“靜態(tài)局部變量”。靜態(tài)局部變量用關鍵字static進行聲明例如:staticinta=3;C語言程序設計@SoochowUniversity54用static聲明局部變量靜態(tài)局部變量C語言程序設計@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語言程序設計@SoochowUniversity55運行結(jié)果為: 7
8
9靜態(tài)變量 f(inta)C語言程序設計@SoochowU對靜態(tài)局部變量的說明(1)生存期靜態(tài)局部變量屬于靜態(tài)存儲類別,在靜態(tài)存儲區(qū)內(nèi)分配存儲單元。在程序整個運行期間都不釋放。自動變量(即動態(tài)局部變量)屬于動態(tài)存儲類別,占動態(tài)存儲區(qū)空間而不占靜態(tài)存儲區(qū)空間,函數(shù)調(diào)用結(jié)束后即釋放。(2)初始化靜態(tài)局部變量是在編譯時初始化的,即只初始化一次,在程序運行時它已有初值。以后每次調(diào)用函數(shù)時不再重新賦初值而只是保留上次函數(shù)調(diào)用結(jié)束時的值。自動變量初始化不是在編譯時進行的,而是在函數(shù)調(diào)用時進行,每調(diào)用一次函數(shù)重新給一次初值,相當于執(zhí)行一次賦值語句。C語言程序設計@SoochowUniversity56對靜態(tài)局部變量的說明(1)生存期C語言程序設計@Sooch對靜態(tài)局部變量的說明(3)默認值:(在定義局部變量時不初始化)靜態(tài)局部變量在編譯時自動賦初值0(對數(shù)值型變量)或空字符(對字符變量)。自動變量的值是一個不確定的值。這是由于每次函數(shù)調(diào)用結(jié)束后存儲單元已釋放,下次調(diào)用時又重新另分配存儲單元,而所分配的單元中的值是不確定的。(4)作用域雖然靜態(tài)局部變量在函數(shù)調(diào)用結(jié)束后仍然存在,但其他函數(shù)是不能引用它的,也就是說作用域?qū)儆诙x變量的函數(shù)。(這是和全局變量的區(qū)別)自動變量的作用域是屬于定義變量的函數(shù)。C語言程序設計@SoochowUniversity57對靜態(tài)局部變量的說明(3)默認值:(在定義局部變量時不初需用靜態(tài)局部變量的幾種情況(1)需要保留函數(shù)上一次調(diào)用結(jié)束時的值。C語言程序設計@SoochowUniversity58intfac(intn){staticintf=1;
f=f*n;
return(f);}main(){inti;
for(i=1;i<=5;i++)
printf(“%d?。剑”,i,fac(i));
printf(“\n”);}運行結(jié)果為:1!=12?。?3?。?4!=245?。?20需用靜態(tài)局部變量的幾種情況(1)需要保留函數(shù)上一次調(diào)用結(jié)束需用靜態(tài)局部變量的幾種情況(2)如果初始化后,變量只被引用而不改變其值,這時用靜態(tài)局部變量比較方便,以免每次調(diào)用時重新賦值。靜態(tài)局部變量的缺點用靜態(tài)存儲要多占內(nèi)存(長期占用不釋放,而不能像動態(tài)存儲那樣一個存儲單元可供多個變量使用,節(jié)約內(nèi)存),而且降低了程序的可讀性,當調(diào)用次數(shù)多時往往弄不清靜態(tài)局部變量的當前值是什么。因此,如不必要,不要多用靜態(tài)局部變量。C語言程序設計@SoochowUniversity59需用靜態(tài)局部變量的幾種情況(2)如果初始化后,變量只被引用register變量一般情況下的變量存儲及運算過程使用頻繁的變量的特殊使用方法:寄存器變量C語言允許將局部變量的值放在CPU的寄存器中存放在CPU寄存器中的變量叫做“寄存器變量”,用關鍵字register作聲明。C語言程序設計@SoochowUniversity60register變量一般情況下的變量存儲及運算過程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語言程序設計@SoochowUniversity61例如 intfac(intn)C語言程序設計@Sooc有關寄存器變量說明(1)只有局部自動變量和形式參數(shù)可以作為寄存器變量,其他(如全局變量)不行。在調(diào)用一個函數(shù)時占用一些寄存器以存放寄存器變量的值,函數(shù)調(diào)用結(jié)束釋放寄存器。此后,在調(diào)用另一個函數(shù)時又可以利用它來存放該函數(shù)的寄存器變量。(2)一個計算機系統(tǒng)中的寄存器數(shù)目是有限的,不能定義任意多個寄存器變量。(3)局部靜態(tài)變量不能定義為寄存器變量。不能寫成registerstaticinta,b,c;不能把變量a、b、c既放在靜態(tài)存儲區(qū)中,又放在寄存器中,二者只能居其一。對一個變量只能聲明為一個存儲類別。C語言程序設計@SoochowUniversity62有關寄存器變量說明(1)只有局部自動變量和形式參數(shù)可以作為用extern聲明外部變量外部變量(即全局變量)的作用域的規(guī)定:它的作用域為從變量的定義處開始,到本程序文件的末尾。在此作用域內(nèi),全局變量可以為程序中各個函數(shù)所引用。編譯時將外部變量分配在靜態(tài)存儲區(qū)。外部變量(即全局變量)的作用域的擴展:有時需要用extern來聲明外部變量,以擴展外部變量的作用域C語言程序設計@SoochowUniversity63用extern聲明外部變量外部變量(即全局變量)的作用域的規(guī)用extern聲明外部變量1.在一個文件內(nèi)聲明外部變量如果外部變量不在文件的開頭定義,其有效的作用范圍只限于從定義處開始處起到文件終了的區(qū)域。如果在定義點之前的函數(shù)想引用該外部變量,則應該在引用之前用關鍵字extern對該變量作“外部變量聲明”。表示該變量是一個已經(jīng)定義的外部變量。有了此聲明,就可以從“聲明”處起,合法地使用該外部變量。C語言程序設計@SoochowUniversity64用extern聲明外部變量1.在一個文件內(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語言程序設計@SoochowUniversity65用extern聲明外部變量時,類型名可以寫也可以省寫。例如上例中的“externintA;”也可以寫成:“externA;”。例如//file.c C語言程序設計@SoochowUni用extern聲明外部變量2.在多文件的程序中聲明外部變量多文件的程序結(jié)構(gòu)中一個文件要使用另一個文件中定義的外部變量如果一個程序包含兩個文件,在兩個文件中都要用到同一個外部變量Num,不能分別在兩個文件中各自定義一個外部變量Num,否則在進行程序的連接時會出現(xiàn)“重復定義”的錯誤。多文件的程序結(jié)構(gòu)中外部變量引用的正確的做法:在任一個文件中定義外部變量Num,而在其他文件中用extern對Num作“外部變量聲明”。即externNum;在編譯和連接時,系統(tǒng)會由此知道Num是一個已在別處定義的外部變量,并將在另一文件中定義的外部變量的作用域擴展到本文件,在本文件中可以合法地引用外部變量Num。C語言程序設計@SoochowUniversity66用extern聲明外部變量2.在多文件的程序中聲明外部變量C多文件程序?qū)嵗胑xtern將外部變量的作用域擴展到其他文件。本程序的作用是給定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語言程序設計@SoochowUniversity67文件file2.c中的內(nèi)容為:externA;/*聲明A為一個已定義的外部變量*/power(intn){inti,y=1;
for(i=1;i<=n;i++)
y*=A;
return(y);}多文件程序?qū)嵗胑xtern將外部變量的作用域擴展到用extern聲明外部變量多文件中外部變量聲明的注意事項:用這樣的全局變量應十分慎重,因為在執(zhí)行一個文件中的函數(shù)時,可能會改變了該全局變量的值,它會影響到另一文件中的函數(shù)執(zhí)行結(jié)果。多文件中外部變量聲明的深入理解:先在本文件中找外部變量的定義,如果找到,就在本文件中擴展作用域。如果找不到,就在連接時從其他文件中找外部變量的定義,如果找到,就將作用域擴展到本文件。如果找不到,按出錯處理。C語言程序設計@SoochowUniversity68用extern聲明外部變量多文件中外部變量聲明的注意事項:C用static聲明外部變量static聲明的含義:有時在程序設計中希望某些外部變量只限于被本文件引用,而不能被其他文件引用。這時可以在定義外部變量時加一個static聲明。C語言程序設計@SoochowUniversity69這里的extern聲明是無效的file1.cfile2.cstaticintA;externintA;main()fun(intn){{….…}A=A*n;…}用static聲明外部變量static聲明的含義:有時在程序用static聲明外部變量靜態(tài)外部變量用static聲明、只能用于本文件的外部變量(全局變量)稱為靜態(tài)外部變量。在程序設計中,常由若干人分別完成各個模塊,各人可以獨立地在其設計的文件中使用相同的外部變量名而互不相干。只需在每個文件中的外部變量前加上static即可。這就為程序的模塊化、通用性提供方便。如果已知道其他文件不引用本文件的外部變量,可以對本文件中的外部變量都加上static,成為靜態(tài)外部變量,以免被其他文件誤用。重要理解:需要指出對外部變量加static聲明,并不意味著這時才是靜態(tài)存儲(存放在靜態(tài)存儲區(qū)中),而不加static的是動態(tài)存儲(存放在動態(tài)存儲區(qū))。兩種形式的外部變量都是靜態(tài)存儲方式,只是作用范圍不同而已,都是在編譯時分配內(nèi)存的。C語言程序設計@SoochowUniversity70用static聲明外部變量靜態(tài)外部變量C語言程序設計@Soo關于變量的聲明和定義函數(shù)的聲明和定義的明顯區(qū)別:函數(shù)的聲明是函數(shù)的原型,而函數(shù)的定義是函數(shù)的本身。其實聲明就是通知編譯器函數(shù)的類型,參數(shù)的類型,返回值類型等;而定義是實實在在的分配內(nèi)存空間。同理,變量的聲明和定義也是一樣變量的定義和聲明之間的區(qū)別不是特別明顯:定義性聲明:需要建立存儲空間的變量聲明(如:inta;)引用性聲明:不需要建立存儲空間的聲明(如:externa;)。C語言程序設計@SoochowUniversity71關于變量的聲明和定義函數(shù)的聲明和定義的明顯區(qū)別:C語言程序設關于變量的聲明和定義廣義地說,聲明包括定義,但并非所有的聲明都是定義。對“inta;”
而言,它既是聲明,又是定義。而對“externa;”
而言,它是聲明而不是定義。一般為了敘述方便,把建立存儲空間的聲明稱定義,而把不需要建立存儲空間的聲明稱為聲明。顯然這里指的聲明是狹義的,即非定義性聲明。C語言程序設計@SoochowUniversity72
main(){externA;/*是聲明不是定義。聲明A是一個已定義的外部變量*/…}intA;/*是定義,定義A為整型外部變量*/關于變量的聲明和定義廣義地說,聲明包括定義,但并非所有的聲明關于變量的聲明和定義外部變量定義和外部變量聲明的含義是不同的外部變量的定義只能有一次,它的位置在所有函數(shù)之外,而同一文件中的外部變量的聲明可以有多次,它的位置可以在函數(shù)之內(nèi)(哪個函數(shù)要用就在哪個函數(shù)中聲明)也可以在函數(shù)之外(在外部變量的定義點之前)。變量的extern聲明只用作聲明,而不用于定義。變量的static聲明(1)對局部變量用static聲明,則為該變量分配的空間在整個程序執(zhí)行期間始終存在。(2)全局變量用static聲明,則該變量的作用域只限于本文件模塊(即被聲明的文件中)。某些聲明不能單獨進行用auto、register、static聲明變量時,是在定義變量的基礎上加上這些關鍵字,而不能單獨使用。C語言程序設計@SoochowUniversity73關于變量的聲明和定義外部變量定義和外部變量聲明的含義是不同的存儲類別小結(jié)對一個數(shù)據(jù)的定義,需要指定兩種屬性:數(shù)據(jù)類型和存儲類別,分別使用兩個關鍵字。如:staticinta;(靜態(tài)內(nèi)部整型變量或靜態(tài)外部整型變量)autocharc;(自動變量,在函數(shù)內(nèi)定義)用extern聲明變量為已定義的外部變量,如:externb;(聲明b是一個已被定義的外部變量)C語言程序設計@SoochowUniversity74存儲類別小結(jié)對一個數(shù)據(jù)的定義,需要指定兩種屬性:數(shù)據(jù)類型和存從不同角度做歸納(1)從作用域角度分,有局部變量和全局變量。(2)從變量存在的時間來區(qū)分,有動態(tài)存儲和靜態(tài)存儲兩種類型。(3)從變量值存放的位置來區(qū)分,可分為:內(nèi)存中靜態(tài)存儲區(qū)中存放;內(nèi)存中動態(tài)存儲區(qū)中存放;CPU中的寄存器中存放。(4)關于作用域和生存期的概念。(5)static對局部變量和全局變量的作用不同。詳細的請參考原書內(nèi)容C語言程序設計@SoochowUniversity75從不同角度做歸納(1)從作用域角度分,有局部變量和全局變量內(nèi)部函數(shù)和外部函數(shù)基本概念
函數(shù)本質(zhì)上是全局的,因為一個函數(shù)要被另外的函數(shù)調(diào)用,但是,也可以指定函數(shù)不能被其他文件調(diào)用。根據(jù)函數(shù)能否被其他源文件調(diào)用,將函數(shù)區(qū)分為內(nèi)部函數(shù)和外部函數(shù)。內(nèi)部函數(shù)內(nèi)部函數(shù)的概念:如果一個函數(shù)只能被本文件中其他函數(shù)所調(diào)用,它稱為內(nèi)部函數(shù)。內(nèi)部函數(shù)定義方法在定義內(nèi)部函數(shù)時,在函數(shù)名和函數(shù)類型的前面加static。即static類型標識符函數(shù)名(形參表)如staticintfun(inta,intb)內(nèi)部函數(shù)又稱靜態(tài)函數(shù)。使用內(nèi)部函數(shù),可以使函數(shù)只局限于所在文件,如果在不同的文件中有同名的內(nèi)部函數(shù),互不干擾。這樣不同的人可以分別編寫不同的函數(shù),而不必擔心所用函數(shù)是否會與其他文件中函數(shù)同名通常把只能由同一文件使用的函數(shù)和外部變量放在一個文件中,在它們前面都冠以static使之局部化,其他文件不能引用。C語言程序設計@SoochowUniversity76內(nèi)部函數(shù)和外部函數(shù)基本概念C語言程序設計@Soocho外部函數(shù)(1)在定義函數(shù)時,如果在函數(shù)首部的最左端冠以關鍵字extern,則表示此函數(shù)是外部函數(shù),可供其他文件調(diào)用。如函數(shù)首部可以寫為
externintfun(inta,intb)
注意:C語言規(guī)定,如果在定義函數(shù)時省略extern,則隱含為外部函數(shù)。本書前面所用的函數(shù)都是外部函數(shù)。(2)在需要調(diào)用此函數(shù)的文件中,用extern聲明所用的函數(shù)是外部函數(shù)。 例。有一個字符串,內(nèi)有若干個字符,
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 生產(chǎn)細胞庫管理制度匯編
- 生產(chǎn)系統(tǒng)訂單加班制度
- 文廣新旅局安全生產(chǎn)制度
- 初中英語《動詞》專項練習與答案 (100 題)
- 安全生產(chǎn)隱患自查制度
- 初中英語《并列句》專項練習與答案 (100 題)
- 公司生產(chǎn)車間消防套裝管理制度
- 2026年計算機二級編程語言模擬試題
- 2026年法律案例分析與解決法律糾紛的技巧試題
- 2025年醫(yī)保的相關試題及答案
- 2026中國國際航空招聘面試題及答案
- (2025年)工會考試附有答案
- 2026年國家電投集團貴州金元股份有限公司招聘備考題庫完整參考答案詳解
- 復工復產(chǎn)安全知識試題及答案
- 中燃魯西經(jīng)管集團招聘筆試題庫2026
- 資產(chǎn)接收協(xié)議書模板
- 數(shù)據(jù)中心合作運營方案
- 印鐵涂料基礎知識
- 工資欠款還款協(xié)議書
- 石籠網(wǎng)廠施工技術交底
- 新建粉煤灰填埋場施工方案
評論
0/150
提交評論