




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、7.1為什么要用函數(shù)為什么要用函數(shù) 7.2怎樣定義函數(shù)怎樣定義函數(shù)7.3調(diào)用函數(shù)調(diào)用函數(shù)7.4對被調(diào)用函數(shù)的聲明和函數(shù)原型對被調(diào)用函數(shù)的聲明和函數(shù)原型7.5函數(shù)的嵌套調(diào)用函數(shù)的嵌套調(diào)用 7.6函數(shù)的遞歸調(diào)用函數(shù)的遞歸調(diào)用7.7數(shù)組作為函數(shù)參數(shù)數(shù)組作為函數(shù)參數(shù) 7.8局部變量和全局變量局部變量和全局變量7.9變量的存儲方式和生存期變量的存儲方式和生存期7.10 關(guān)于變量的聲明和定義關(guān)于變量的聲明和定義7.11 內(nèi)部函數(shù)和外部函數(shù)內(nèi)部函數(shù)和外部函數(shù)1數(shù)組元素作函數(shù)實參數(shù)組元素作函數(shù)實參數(shù)組名作函數(shù)參數(shù)數(shù)組名作函數(shù)參數(shù)多維數(shù)組名作函數(shù)參數(shù)多維數(shù)組名作函數(shù)參數(shù)2 例例7.9 輸入輸入10個數(shù),要求輸出
2、其中值最大個數(shù),要求輸出其中值最大的元素和該數(shù)是第幾個數(shù)。的元素和該數(shù)是第幾個數(shù)。3解題思路:解題思路:u定義數(shù)組定義數(shù)組a,用來存放,用來存放10個數(shù)個數(shù)u設計函數(shù)設計函數(shù)max,用來求兩個數(shù)中的大者,用來求兩個數(shù)中的大者u在主函數(shù)中定義變量在主函數(shù)中定義變量m,初值為,初值為a0,每次調(diào),每次調(diào)用用max函數(shù)后的返回值存放在函數(shù)后的返回值存放在m中中u用用“打擂臺打擂臺”算法,依次將數(shù)組元素算法,依次將數(shù)組元素a1到到a9與與m比較,最后得到的比較,最后得到的m值就是值就是10個數(shù)中個數(shù)中的最大者的最大者4#include int main() int max(int x,int y);
3、int a10,m,n,i; printf(“10 integer numbers:n); for(i=0;i10;i+) scanf(%d,&ai); printf(n);5 for(i=1,m=a0,n=0;im) m=max(m,ai); n=i; printf(“l(fā)argest number is %dn,m); printf(“%dth number.n“,n+1);int max(int x,int y) return(xy?x:y); 6除了可以用數(shù)組元素作為函數(shù)參數(shù)外,還可除了可以用數(shù)組元素作為函數(shù)參數(shù)外,還可以用數(shù)組名作函數(shù)參數(shù)(包括實參和形參)以用數(shù)組名作函數(shù)參數(shù)(
4、包括實參和形參)用數(shù)組元素作實參時,向形參變量傳遞的是用數(shù)組元素作實參時,向形參變量傳遞的是數(shù)組元素的值數(shù)組元素的值用數(shù)組名作函數(shù)實參時,向形參傳遞的是數(shù)用數(shù)組名作函數(shù)實參時,向形參傳遞的是數(shù)組首元素的地址組首元素的地址7 例例7.10 有一個一維數(shù)組有一個一維數(shù)組score,內(nèi)放,內(nèi)放10個個學生成績,求平均成績。學生成績,求平均成績。解題思路:解題思路:u用函數(shù)用函數(shù)average求平均成績,用數(shù)組名作為函求平均成績,用數(shù)組名作為函數(shù)實參,形參也用數(shù)組名數(shù)實參,形參也用數(shù)組名u在在average函數(shù)中引用各數(shù)組元素,求平均成函數(shù)中引用各數(shù)組元素,求平均成績并返回績并返回main函數(shù)函數(shù)8#
5、include int main() float average(float array10); float score10,aver; int i; printf(input 10 scores:n); for(i=0;i10;i+) scanf(%f,&scorei); printf(n); aver=average(score); printf(%5.2fn,aver); return 0; 定義實參數(shù)組定義實參數(shù)組9float average(float array10) int i; float aver,sum=array0; for(i=1;i10;i+) sum=sum
6、+arrayi; aver=sum/10; return(aver);定義形參數(shù)組定義形參數(shù)組相當于相當于score0相當于相當于scorei10 例例7.11 有兩個班級,分別有有兩個班級,分別有35名和名和30名學名學生,調(diào)用一個生,調(diào)用一個average函數(shù),分別求這兩個函數(shù),分別求這兩個班的學生的平均成績。班的學生的平均成績。11解題思路:解題思路:u需要解決怎樣用同一個函數(shù)求兩個不同長度的需要解決怎樣用同一個函數(shù)求兩個不同長度的數(shù)組的平均值的問題數(shù)組的平均值的問題u定義定義average函數(shù)時不指定數(shù)組的長度,在函數(shù)時不指定數(shù)組的長度,在形參表中增加一個整型變量形參表中增加一個整型變
7、量iu從主函數(shù)把數(shù)組實際長度從實參傳遞給形參從主函數(shù)把數(shù)組實際長度從實參傳遞給形參iu這個這個i用來在用來在average函數(shù)中控制循環(huán)的次數(shù)函數(shù)中控制循環(huán)的次數(shù)u為簡化,設兩個班的學生數(shù)分別為為簡化,設兩個班的學生數(shù)分別為5和和1012#include int main() float average(float array ,int n); float score15=98.5,97,91.5,60,55; float score210=67.5,89.5,99,69.5, 77,89.5,76.5,54,60,99.5; printf(“%6.2fn”,average(score1,5)
8、; printf(“%6.2fn”,average(score2,10); return 0;13float average(float array ,int n) int i; float aver,sum=array0; for(i=1;in;i+) sum=sum+arrayi; aver=sum/n; return(aver);調(diào)用形式為調(diào)用形式為average(score1,5)時時相當于相當于score10相當于相當于score1i相當于相當于514float average(float array ,int n) int i; float aver,sum=array0; for
9、(i=1;in;i+) sum=sum+arrayi; aver=sum/n; return(aver);調(diào)用形式為調(diào)用形式為average(score2,10)時時相當于相當于score20相當于相當于score2i相當于相當于1015 例例7.13 有一個的矩陣,求所有元素中有一個的矩陣,求所有元素中的最大值。的最大值。解題思路:先使變量解題思路:先使變量max的初值等于矩陣中第的初值等于矩陣中第一個元素的值,然后將矩陣中各個元素的值與一個元素的值,然后將矩陣中各個元素的值與max相比,每次比較后都把相比,每次比較后都把“大者大者”存放在存放在max中,全部元素比較完后,中,全部元素比較完
10、后,max 的值就是的值就是所有元素的最大值。所有元素的最大值。16#include int main() int max_value(int array4); int a34=1,3,5,7,2,4,6,8, 15,17,34,12; printf(“Max value is %dn”, max_value(a); return 0;可以省略可以省略不能省略不能省略要與要與形參數(shù)組第形參數(shù)組第二二維大小維大小相同相同17int max_value(int array4) int i,j,max; max = array00; for (i=0;i3;i+) for(j=0;jmax) max
11、 = arrayij; return (max);要與實參要與實參數(shù)組第數(shù)組第二二維大小維大小相同相同18局部變量局部變量全局變量全局變量19定義變量可能有三種情況:定義變量可能有三種情況:u在函數(shù)的開頭定義在函數(shù)的開頭定義u在函數(shù)內(nèi)的復合語句內(nèi)定義在函數(shù)內(nèi)的復合語句內(nèi)定義u在函數(shù)的外部定義在函數(shù)的外部定義20在一個函數(shù)內(nèi)部定義的變量只在本函數(shù)范圍在一個函數(shù)內(nèi)部定義的變量只在本函數(shù)范圍內(nèi)有效內(nèi)有效在復合語句內(nèi)定義的變量只在本復合語句范在復合語句內(nèi)定義的變量只在本復合語句范圍內(nèi)有效圍內(nèi)有效在在函數(shù)內(nèi)部函數(shù)內(nèi)部或復合語句內(nèi)部定義的變量稱為或復合語句內(nèi)部定義的變量稱為“局部變量局部變量”21floa
12、t f1(int a) int b,c; char f2(int x,int y) int i,j; int main( ) int m,n; return 0; a、b、c僅在僅在此函數(shù)內(nèi)此函數(shù)內(nèi)有效有效x、y、i、j僅在僅在此函數(shù)內(nèi)此函數(shù)內(nèi)有效有效m、n僅在此僅在此函數(shù)內(nèi)函數(shù)內(nèi)有效有效22float f1(int a) int b,c; char f2(int x,int y) int i,j; int main( ) int a,b; return 0; 類似于不同類似于不同班同名學生班同名學生a、b也僅在此也僅在此函數(shù)內(nèi)函數(shù)內(nèi)有效有效23int main ( ) int a,b; in
13、t c; c=a+b; c僅在此復合僅在此復合語句內(nèi)語句內(nèi)有效有效a、b僅在此復僅在此復合語句內(nèi)合語句內(nèi)有效有效24在函數(shù)內(nèi)定義的變量是局部變量在函數(shù)內(nèi)定義的變量是局部變量,而在函數(shù)而在函數(shù)之外定義的變量稱為之外定義的變量稱為外部變量外部變量外部變量是全局變量外部變量是全局變量(也稱全程變量也稱全程變量)全局變量可以為本文件中其他函數(shù)所共用全局變量可以為本文件中其他函數(shù)所共用有效范圍為從定義變量的位置開始到本源文有效范圍為從定義變量的位置開始到本源文件結(jié)束件結(jié)束25int p=1,q=5float f1(int a) int b,c; char c1,c2;char f2 (int x, in
14、t y) int i,j; int main ( ) int m,n; return 0;p、q、c1、c2為為全局變量全局變量26int p=1,q=5float f1(int a) int b,c; char c1,c2;char f2 (int x, int y) int i,j; int main ( ) int m,n; return 0;p、q的有效范圍的有效范圍c1、c2的有效范圍的有效范圍27 例例7.14 有一個一維數(shù)組,內(nèi)放有一個一維數(shù)組,內(nèi)放10個學生成個學生成績,寫一個函數(shù),當主函數(shù)調(diào)用此函數(shù)后,績,寫一個函數(shù),當主函數(shù)調(diào)用此函數(shù)后,能求出平均分、最高分和最低分。能求出
15、平均分、最高分和最低分。解題思路:調(diào)用一個函數(shù)可以得到一個函數(shù)解題思路:調(diào)用一個函數(shù)可以得到一個函數(shù)返回值,現(xiàn)在希望通過函數(shù)調(diào)用能得到返回值,現(xiàn)在希望通過函數(shù)調(diào)用能得到3個結(jié)個結(jié)果??梢岳萌肿兞縼磉_到此目的。果??梢岳萌肿兞縼磉_到此目的。28#include float Max=0,Min=0; int main() float average(float array ,int n); float ave,score10; int i; printf(Please enter 10 scores:n); for(i=0;i10;i+) scanf(%f,&scorei); av
16、e=average(score,10); printf(max=%6.2fnmin=%6.2fn average=%6.2fn,Max,Min,ave); return 0; 29float average(float array ,int n) int i; float aver,sum=array0; Max=Min=array0; for(i=1;iMax) Max=arrayi; else if(arrayiMin) Min=arrayi; sum=sum+arrayi; aver=sum/n; return(aver); 30 ave score 10 Max Min aver ar
17、ray n Max Minmain函數(shù)函數(shù)average函數(shù)函數(shù)建議不在必要時不要使用全局變量建議不在必要時不要使用全局變量31 例例7.15 若外部變量與局部變量同名,分若外部變量與局部變量同名,分析結(jié)果。析結(jié)果。32#include int a=3,b=5; int main() int max(int a,int b); int a=8; printf(“max=%dn”,max(a,b); return 0; int max(int a,int b) int c; c=ab?a:b; return(c); a為為局局部部變量變量,僅,僅在此函數(shù)內(nèi)有效在此函數(shù)內(nèi)有效b為全部為全部變量變量
18、33#include int a=3,b=5; int main() int max(int a,int b); int a=8; printf(“max=%dn”,max(a,b); return 0; int max(int a,int b) int c; c=ab?a:b; return(c); a、b為為局局部部變量變量,僅,僅在此函數(shù)內(nèi)有效在此函數(shù)內(nèi)有效34動態(tài)存儲方式與靜態(tài)存儲方式動態(tài)存儲方式與靜態(tài)存儲方式局部變量的存儲類別局部變量的存儲類別全局變量的存儲類別全局變量的存儲類別存儲類別小結(jié)存儲類別小結(jié)35從變量的作用域角度觀察,變量可以分為從變量的作用域角度觀察,變量可以分為全局變
19、量全局變量和和局部變量局部變量從變量值存在的時間從變量值存在的時間(即生存期即生存期)觀察觀察,變量的存儲有變量的存儲有兩種不同的方式:兩種不同的方式:靜態(tài)存儲方式靜態(tài)存儲方式和和動態(tài)存儲方式動態(tài)存儲方式u靜態(tài)存儲方式是指在程序運行期間由系統(tǒng)分配固靜態(tài)存儲方式是指在程序運行期間由系統(tǒng)分配固定的存儲空間的方式定的存儲空間的方式u動態(tài)存儲方式是在程序運行期間根據(jù)需要進行動動態(tài)存儲方式是在程序運行期間根據(jù)需要進行動態(tài)的分配存儲空間的方式態(tài)的分配存儲空間的方式36程序區(qū)程序區(qū)靜態(tài)存儲區(qū)靜態(tài)存儲區(qū)動態(tài)存儲區(qū)動態(tài)存儲區(qū)用戶區(qū)用戶區(qū)將將數(shù)據(jù)存放在數(shù)據(jù)存放在此區(qū)此區(qū)全局變量全部存放全局變量全部存放在靜態(tài)存儲區(qū)
20、中在靜態(tài)存儲區(qū)中函數(shù)形式參數(shù)函函數(shù)形式參數(shù)函數(shù)中定義的沒有用關(guān)數(shù)中定義的沒有用關(guān)鍵字鍵字static聲明的變量聲明的變量函數(shù)調(diào)用時的現(xiàn)場函數(shù)調(diào)用時的現(xiàn)場保護和返回地址等保護和返回地址等存存放在動態(tài)存儲區(qū)放在動態(tài)存儲區(qū)程序程序開始執(zhí)行時給全局開始執(zhí)行時給全局變量分配存儲區(qū),程序變量分配存儲區(qū),程序執(zhí)行完畢就釋放。在程執(zhí)行完畢就釋放。在程序執(zhí)行過程中占據(jù)固定序執(zhí)行過程中占據(jù)固定的存儲單元的存儲單元函數(shù)調(diào)用開始時分配,函數(shù)調(diào)用開始時分配,函數(shù)結(jié)束時釋放。在程函數(shù)結(jié)束時釋放。在程序執(zhí)行過程中,這種分序執(zhí)行過程中,這種分配和釋放是動態(tài)的配和釋放是動態(tài)的37每一個變量和函數(shù)都有兩個屬性:每一個變量和函數(shù)都
21、有兩個屬性:數(shù)據(jù)類型數(shù)據(jù)類型和和數(shù)據(jù)的數(shù)據(jù)的存儲類別存儲類別u數(shù)據(jù)類型數(shù)據(jù)類型,如整型、浮點型等,如整型、浮點型等u存儲類別存儲類別指的是數(shù)據(jù)在內(nèi)存中存儲的方式指的是數(shù)據(jù)在內(nèi)存中存儲的方式(如靜態(tài)如靜態(tài)存儲和動態(tài)存儲存儲和動態(tài)存儲)u存儲類別存儲類別包括包括: 自動的、靜態(tài)的、寄存器的、外部的自動的、靜態(tài)的、寄存器的、外部的u根據(jù)變量的存儲類別,可以知道變量的作用域和根據(jù)變量的存儲類別,可以知道變量的作用域和生存期生存期381.自動變量自動變量(auto變量變量)u局部變量,如果不專門聲明存儲類別,都是動態(tài)局部變量,如果不專門聲明存儲類別,都是動態(tài)地分配存儲空間的地分配存儲空間的u調(diào)用函數(shù)時,
22、系統(tǒng)會給調(diào)用函數(shù)時,系統(tǒng)會給局部局部變量分配存儲空間,變量分配存儲空間,調(diào)用結(jié)束時就自動釋放空間。因此這類局部變量調(diào)用結(jié)束時就自動釋放空間。因此這類局部變量稱為自動變量稱為自動變量u自動變量用關(guān)鍵字自動變量用關(guān)鍵字auto作存儲類別的聲明作存儲類別的聲明39int f(int a) auto int b,c=3; 可以省略可以省略402.靜態(tài)局部變量靜態(tài)局部變量(static局部變量局部變量)希望函數(shù)中的局部變量在函數(shù)調(diào)用結(jié)束后不希望函數(shù)中的局部變量在函數(shù)調(diào)用結(jié)束后不消失而繼續(xù)消失而繼續(xù)保留原值保留原值,即其占用的存儲單元,即其占用的存儲單元不釋放,在下一次再調(diào)用該函數(shù)時,該變量不釋放,在下一
23、次再調(diào)用該函數(shù)時,該變量已有值已有值(就是上一次函數(shù)調(diào)用結(jié)束時的值就是上一次函數(shù)調(diào)用結(jié)束時的值),這時就應該指定該局部變量為這時就應該指定該局部變量為“靜態(tài)局部變靜態(tài)局部變量量”,用關(guān)鍵字,用關(guān)鍵字static進行聲明進行聲明41 例例7.16 考察靜態(tài)局部變量的值??疾祆o態(tài)局部變量的值。#include int main() int f(int); int a=2,i; for(i=0;i3;i+) printf(“%dn”,f(a); return 0;int f(int a) auto int b=0; static c=3; b=b+1; c=c+1; return(a+b+c);調(diào)用
24、三次調(diào)用三次每調(diào)用一次,開辟每調(diào)用一次,開辟新新a和和b,但,但c不是不是42 例例7.16 考察靜態(tài)局部變量的值??疾祆o態(tài)局部變量的值。#include int main() int f(int); int a=2,i; for(i=0;i3;i+) printf(“%dn”,f(a); return 0;int f(int a) auto int b=0; static c=3; b=b+1; c=c+1; return(a+b+c);03bc第一次調(diào)用開始第一次調(diào)用開始43 例例7.16 考察靜態(tài)局部變量的值??疾祆o態(tài)局部變量的值。#include int main() int f(in
25、t); int a=2,i; for(i=0;i3;i+) printf(“%dn”,f(a); return 0;int f(int a) auto int b=0; static c=3; b=b+1; c=c+1; return(a+b+c);03bc第一次調(diào)用期間第一次調(diào)用期間1444 例例7.16 考察靜態(tài)局部變量的值??疾祆o態(tài)局部變量的值。#include int main() int f(int); int a=2,i; for(i=0;i3;i+) printf(“%dn”,f(a); return 0;int f(int a) auto int b=0; static c=3
26、; b=b+1; c=c+1; return(a+b+c);bc第一次調(diào)用結(jié)束第一次調(diào)用結(jié)束14745 例例7.16 考察靜態(tài)局部變量的值。考察靜態(tài)局部變量的值。#include int main() int f(int); int a=2,i; for(i=0;i3;i+) printf(“%dn”,f(a); return 0;int f(int a) auto int b=0; static c=3; b=b+1; c=c+1; return(a+b+c);bc第二次調(diào)用開始第二次調(diào)用開始0446 例例7.16 考察靜態(tài)局部變量的值??疾祆o態(tài)局部變量的值。#include int mai
27、n() int f(int); int a=2,i; for(i=0;i3;i+) printf(“%dn”,f(a); return 0;int f(int a) auto int b=0; static c=3; b=b+1; c=c+1; return(a+b+c);bc第二次調(diào)用期間第二次調(diào)用期間04 5147 例例7.16 考察靜態(tài)局部變量的值??疾祆o態(tài)局部變量的值。#include int main() int f(int); int a=2,i; for(i=0;i3;i+) printf(“%dn”,f(a); return 0;int f(int a) auto int b=
28、0; static c=3; b=b+1; c=c+1; return(a+b+c);bc第二次調(diào)用結(jié)束第二次調(diào)用結(jié)束15848 例例7.16 考察靜態(tài)局部變量的值??疾祆o態(tài)局部變量的值。#include int main() int f(int); int a=2,i; for(i=0;i3;i+) printf(“%dn”,f(a); return 0;int f(int a) auto int b=0; static c=3; b=b+1; c=c+1; return(a+b+c);bc第三次調(diào)用開始第三次調(diào)用開始0549 例例7.16 考察靜態(tài)局部變量的值??疾祆o態(tài)局部變量的值。#in
29、clude int main() int f(int); int a=2,i; for(i=0;i3;i+) printf(“%dn”,f(a); return 0;int f(int a) auto int b=0; static c=3; b=b+1; c=c+1; return(a+b+c);bc第三次調(diào)用期間第三次調(diào)用期間05 6150 例例7.16 考察靜態(tài)局部變量的值。考察靜態(tài)局部變量的值。#include int main() int f(int); int a=2,i; for(i=0;i3;i+) printf(“%dn”,f(a); return 0;int f(int a
30、) auto int b=0; static c=3; b=b+1; c=c+1; return(a+b+c);bc第三次調(diào)用結(jié)束第三次調(diào)用結(jié)束16951 例例7.16 考察靜態(tài)局部變量的值。考察靜態(tài)局部變量的值。#include int main() int f(int); int a=2,i; for(i=0;i3;i+) printf(“%dn”,f(a); return 0;int f(int a) auto int b=0; static c=3; b=b+1; c=c+1; return(a+b+c);c整個程序結(jié)束整個程序結(jié)束652 例例7.16 考察靜態(tài)局部變量的值。考察靜態(tài)局
31、部變量的值。#include int main() int f(int); int a=2,i; for(i=0;i3;i+) printf(“%dn”,f(a); return 0;int f(int a) auto int b=0; static c=3; b=b+1; c=c+1; return(a+b+c);在編譯時賦初值在編譯時賦初值在函數(shù)調(diào)用時賦初值在函數(shù)調(diào)用時賦初值53 例例7.16 考察靜態(tài)局部變量的值??疾祆o態(tài)局部變量的值。#include int main() int f(int); int a=2,i; for(i=0;i3;i+) printf(“%dn”,f(a);
32、return 0;int f(int a) auto int b=0; static c=3; b=b+1; c=c+1; return(a+b+c);若不賦若不賦初值初值,是,是0若不若不賦初值賦初值,不確定,不確定54 例例7.16 考察靜態(tài)局部變量的值。考察靜態(tài)局部變量的值。#include int main() int f(int); int a=2,i; for(i=0;i3;i+) printf(“%dn”,f(a); return 0;int f(int a) auto int b=0; static c=3; b=b+1; c=c+1; return(a+b+c);僅在本函數(shù)內(nèi)
33、有效僅在本函數(shù)內(nèi)有效55例例7.17 輸出輸出1到到5的階乘值。的階乘值。解題思路:可以編一個函數(shù)用來進行連乘,解題思路:可以編一個函數(shù)用來進行連乘,如第如第1次調(diào)用時進行次調(diào)用時進行1乘乘1,第,第2次調(diào)用時再次調(diào)用時再乘以乘以2,第,第3次調(diào)用時再乘以次調(diào)用時再乘以3,依此規(guī)律進,依此規(guī)律進行下去。行下去。56#include int main() int fac(int n); int i; for(i=1;i=5;i+) printf(“%d!=%dn”,i,fac(i); return 0;int fac(int n) static int f=1; f=f*n; return(f)
34、; 若非必要,不要多若非必要,不要多用靜態(tài)局部變量用靜態(tài)局部變量573. 寄存器變量寄存器變量(register變量變量)一般情況下,變量(包括靜態(tài)存儲方式和動態(tài)一般情況下,變量(包括靜態(tài)存儲方式和動態(tài)存儲方式)的值是存放在內(nèi)存中的存儲方式)的值是存放在內(nèi)存中的寄存器變量寄存器變量允許將局部變量的值放在允許將局部變量的值放在CPU中中的寄存器中的寄存器中現(xiàn)在的計算機能夠識別使用頻繁的變量,從而現(xiàn)在的計算機能夠識別使用頻繁的變量,從而自動地將這些變量放在寄存器中,而不需要程自動地將這些變量放在寄存器中,而不需要程序設計者指定序設計者指定58全局變量都是存放在靜態(tài)存儲區(qū)中的。因此它全局變量都是存放
35、在靜態(tài)存儲區(qū)中的。因此它們的生存期是固定的,存在于程序的整個運行們的生存期是固定的,存在于程序的整個運行過程過程一般來說,外部變量是在函數(shù)的外部定義的全一般來說,外部變量是在函數(shù)的外部定義的全局變量,它的作用域是局變量,它的作用域是從變量的定義處開始從變量的定義處開始,到本程序到本程序文件的末尾文件的末尾。在此作用域內(nèi),全局變。在此作用域內(nèi),全局變量可以為程序中各個函數(shù)所引用。量可以為程序中各個函數(shù)所引用。591. 在一個文件內(nèi)擴展外部變量的作用域在一個文件內(nèi)擴展外部變量的作用域外部變量有效的作用范圍只限于定義處到外部變量有效的作用范圍只限于定義處到本本文件結(jié)束。文件結(jié)束。 如果如果用關(guān)鍵字用
36、關(guān)鍵字extern對對某某變量作變量作“外部變量外部變量聲明聲明”,則則可以從可以從“聲明聲明”處起,合法地使處起,合法地使用該外部變量用該外部變量60例例7.18 調(diào)用函數(shù),求調(diào)用函數(shù),求3個整數(shù)中的大者。個整數(shù)中的大者。解題思路:用解題思路:用extern聲明外部變量,擴展聲明外部變量,擴展外部變量在程序文件中的作用域。外部變量在程序文件中的作用域。61#include int main() int max( ); extern int A,B,C; scanf(“%d %d %d”,&A,&B,&C); printf(max is %dn,max(); retur
37、n 0; int A ,B ,C; int max( ) int m; m=AB?A:B; if (Cm) m=C; return(m); 622. 將外部變量的作用域擴展到其他文件將外部變量的作用域擴展到其他文件u如果一個程序包含兩個文件,在兩個文件中都要用如果一個程序包含兩個文件,在兩個文件中都要用到同一個外部變量到同一個外部變量Num,不能分別在兩個文件中各,不能分別在兩個文件中各自定義一個外部變量自定義一個外部變量Numu應應在任一個文件中定義外部變量在任一個文件中定義外部變量Num,而在另一文,而在另一文件中用件中用extern對對Num作作“外部變量聲明外部變量聲明”u在編譯和連接
38、時,系統(tǒng)會由此知道在編譯和連接時,系統(tǒng)會由此知道Num有有“外部鏈外部鏈接接”,可以從別處找到已定義的外部變量,可以從別處找到已定義的外部變量Num,并,并將在另一文件中定義的外部變量將在另一文件中定義的外部變量num的作用域的作用域擴展擴展到本文件到本文件63 例例7.19 給定給定b的值,輸入的值,輸入a和,求和,求a*b和和am的值。的值。解題思路:解題思路:u分別編寫兩個文件模塊,其中文件分別編寫兩個文件模塊,其中文件file1包含主包含主函數(shù),另一個文件函數(shù),另一個文件file2包含求包含求am的函數(shù)。的函數(shù)。u在在file1文件中定義外部變量文件中定義外部變量A,在,在file2中
39、用中用extern聲明外部變量聲明外部變量A,把,把A的作用域擴展到的作用域擴展到file2文件。文件。64文件文件file1.c:#include int A; int main() int power(int); int b=3,c,d,m; scanf(%d,%d,&A,&m); c=A*b; printf(%d*%d=%dn,A,b,c); d=power(m); printf(%d*%d=%dn,A,m,d); return 0;65文件文件file2.c:extern A; int power(int n) int i,y=1; for(i=1;i=n;i+) y*
40、=A; return(y);編譯和運行包括多個編譯和運行包括多個文件的程序,可參考文件的程序,可參考C程序設計學習輔導程序設計學習輔導一書的一書的“C語言上機指語言上機指南南”部分部分663.將外部變量的作用域限制在本文件中將外部變量的作用域限制在本文件中有時在程序設計中希望某些外部變量只限有時在程序設計中希望某些外部變量只限于被本文件引用。這時可以在定義外部變于被本文件引用。這時可以在定義外部變量時加一個量時加一個static聲明。聲明。file1.cstatic int A;int main ( ) file2.cextern A;void fun (int n) A=A*n; 只能用于本
41、文件只能用于本文件本文件仍然不能用本文件仍然不能用67用用static聲明一個變量的作用是:聲明一個變量的作用是:(1) 對對局部變量局部變量用用static聲明,把它分配在靜態(tài)存儲聲明,把它分配在靜態(tài)存儲區(qū),該變量在整個程序執(zhí)行期間不釋放,其所分區(qū),該變量在整個程序執(zhí)行期間不釋放,其所分配的空間始終存在。配的空間始終存在。(2) 對對全局變量全局變量用用static聲明,則該變量的作用域只聲明,則該變量的作用域只限于本文件模塊限于本文件模塊(即被聲明的文件中即被聲明的文件中)。68注意:用注意:用auto、register、static聲明變聲明變量時,是在定義變量的基礎上加上這些關(guān)鍵量時,
42、是在定義變量的基礎上加上這些關(guān)鍵字,而不能單獨使用。字,而不能單獨使用。下面用法不對:下面用法不對:int a; static a; 編譯時會被認為編譯時會被認為“重新定義重新定義”。69對一個數(shù)據(jù)的定義,需要指定兩種屬性:對一個數(shù)據(jù)的定義,需要指定兩種屬性:u數(shù)據(jù)類型和存儲類別數(shù)據(jù)類型和存儲類別,分別使用兩個關(guān)鍵字分別使用兩個關(guān)鍵字例如:例如: static int a; auto char c; register int d; u可以用可以用extern聲明已定義的外部變量聲明已定義的外部變量例如:例如: extern b;靜態(tài)局部整型變量或靜態(tài)局部整型變量或靜態(tài)外部整型變量靜態(tài)外部整型變
43、量自動變量,在自動變量,在函數(shù)內(nèi)定義函數(shù)內(nèi)定義寄存器變量,寄存器變量,在函數(shù)內(nèi)定義在函數(shù)內(nèi)定義將已定義的外部變量將已定義的外部變量b的作用域擴展至此的作用域擴展至此70(1)從作用域角度分,有局部變量和全局變從作用域角度分,有局部變量和全局變量。它們采用的存儲類別如下:量。它們采用的存儲類別如下:按作用域角度分按作用域角度分局部變量局部變量全局變量全局變量自動變量自動變量靜態(tài)局部變量靜態(tài)局部變量寄存器變量寄存器變量靜態(tài)外部變量靜態(tài)外部變量外部變量外部變量形式參數(shù)可以定義為自形式參數(shù)可以定義為自動變量或寄存器變量動變量或寄存器變量71(2)從變量存在的時間區(qū)分從變量存在的時間區(qū)分,有動態(tài)存儲和有
44、動態(tài)存儲和靜態(tài)存儲兩種類型。靜態(tài)存儲是程序整個運行靜態(tài)存儲兩種類型。靜態(tài)存儲是程序整個運行時間都存在時間都存在,而動態(tài)存儲則是在調(diào)用函數(shù)時臨而動態(tài)存儲則是在調(diào)用函數(shù)時臨時分配單元時分配單元按生存期分按生存期分動態(tài)存儲動態(tài)存儲靜態(tài)靜態(tài)存儲存儲自動變量自動變量寄存器變量寄存器變量靜態(tài)局部變量靜態(tài)局部變量外部變量外部變量形式參數(shù)形式參數(shù)靜態(tài)外部變量靜態(tài)外部變量72(3)從變量值存放的位置來區(qū)分從變量值存放的位置來區(qū)分,可分為可分為:按變按變量值量值存放存放的位的位置分置分內(nèi)存中靜態(tài)存儲區(qū)內(nèi)存中靜態(tài)存儲區(qū)內(nèi)存中動態(tài)存儲區(qū)內(nèi)存中動態(tài)存儲區(qū)靜態(tài)局部變量靜態(tài)局部變量靜態(tài)外部變量靜態(tài)外部變量自動變量和形式參數(shù)自動變量和形式參數(shù)寄存器變量寄存器變量外部變量外部變量CPU中的寄存器中的寄存器73() 關(guān)于作用域和生存期的概念關(guān)于作用域和生存期的概念對一個變量的屬性可以從兩個方面分析對一個變量的屬性可以從兩個方面分析:u作用域作用域:如果一個變量在某個文件或函數(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. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 陳老師說教育數(shù)學試卷
- 番茄主要病蟲害的危害及針對性綠色防控對策實施
- 貴州地區(qū)的油茶種植現(xiàn)狀及高產(chǎn)栽培技術(shù)的高效實施方案探討
- 2025年冷墩鋼項目發(fā)展計劃
- 中外文明交流史知到課后答案智慧樹章節(jié)測試答案2025年春牡丹江師范學院
- 2025年有機磷系阻燃劑合作協(xié)議書
- 2017-2018學年高中生物必修2課時訓練第2章第1節(jié)第1課時減數(shù)分裂B
- 2025年金屬非切削、成形加工機械合作協(xié)議書
- 填浜工程施工方案
- 物理選修3-5教科版全套講義第三章原子核3-2
- 鍋爐安裝改造維修質(zhì)量保證體系文件(手冊+程序文件+表格+工藝文件匯編)-符合TSG 07-2019特種設備質(zhì)量保證管理體系
- 學習課程方案、課程標準心得體會
- 成人鼻腸管的留置與維護(2021團體標準解讀)-20221004172843
- SN-T 5370-2022 進出口危險貨物檢驗規(guī)程 鋰電池移動電源
- 機械制造質(zhì)量手冊(一)
- 2024-2030年中國互聯(lián)網(wǎng)+印刷行業(yè)深度分析及發(fā)展戰(zhàn)略研究咨詢報告
- 水庫綠化景觀設計項目招標文件模板
- 偉大的《紅樓夢》智慧樹知到期末考試答案章節(jié)答案2024年北京大學
- 小學校園欺凌行為調(diào)查問卷(學生卷)
- 2024年中儲糧集團招聘筆試參考題庫附帶答案詳解
- 新生兒常見問題與處理
評論
0/150
提交評論