![【學(xué)習(xí)】第6章函數(shù)和模塊設(shè)計(jì)_第1頁(yè)](http://file3.renrendoc.com/fileroot_temp3/2022-1/24/bd950cb7-3e00-4721-812f-46875af09d7e/bd950cb7-3e00-4721-812f-46875af09d7e1.gif)
![【學(xué)習(xí)】第6章函數(shù)和模塊設(shè)計(jì)_第2頁(yè)](http://file3.renrendoc.com/fileroot_temp3/2022-1/24/bd950cb7-3e00-4721-812f-46875af09d7e/bd950cb7-3e00-4721-812f-46875af09d7e2.gif)
![【學(xué)習(xí)】第6章函數(shù)和模塊設(shè)計(jì)_第3頁(yè)](http://file3.renrendoc.com/fileroot_temp3/2022-1/24/bd950cb7-3e00-4721-812f-46875af09d7e/bd950cb7-3e00-4721-812f-46875af09d7e3.gif)
![【學(xué)習(xí)】第6章函數(shù)和模塊設(shè)計(jì)_第4頁(yè)](http://file3.renrendoc.com/fileroot_temp3/2022-1/24/bd950cb7-3e00-4721-812f-46875af09d7e/bd950cb7-3e00-4721-812f-46875af09d7e4.gif)
![【學(xué)習(xí)】第6章函數(shù)和模塊設(shè)計(jì)_第5頁(yè)](http://file3.renrendoc.com/fileroot_temp3/2022-1/24/bd950cb7-3e00-4721-812f-46875af09d7e/bd950cb7-3e00-4721-812f-46875af09d7e5.gif)
版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、1/26/2022整理課件1第第 6 章章 函函 數(shù)數(shù) 和和 模模 塊塊 設(shè)設(shè) 計(jì)計(jì) 1/26/2022整理課件2 1/26/2022整理課件3 對(duì)大千世界的許多描述大都可以在計(jì)算機(jī)中運(yùn)用程序?qū)Υ笄澜绲脑S多描述大都可以在計(jì)算機(jī)中運(yùn)用程序設(shè)計(jì)中的函數(shù)問(wèn)題來(lái)解決,設(shè)計(jì)中的函數(shù)問(wèn)題來(lái)解決,C語(yǔ)言程序設(shè)計(jì)也不例外。語(yǔ)言程序設(shè)計(jì)也不例外。 一個(gè)功能較大的系統(tǒng),它一定包含有若干個(gè)相對(duì)獨(dú)立一個(gè)功能較大的系統(tǒng),它一定包含有若干個(gè)相對(duì)獨(dú)立的子功能,通過(guò)子程序模塊來(lái)描述這些子功能,再通過(guò)的子功能,通過(guò)子程序模塊來(lái)描述這些子功能,再通過(guò)對(duì)這些子程序的組織和調(diào)用,來(lái)實(shí)現(xiàn)整個(gè)程序的功能要對(duì)這些子程序的組織和調(diào)用,來(lái)實(shí)
2、現(xiàn)整個(gè)程序的功能要求。而這些功能比較獨(dú)立的子程序模塊則稱(chēng)之為函數(shù)求。而這些功能比較獨(dú)立的子程序模塊則稱(chēng)之為函數(shù) 。本章用于揭開(kāi)函數(shù)的真面目!本章用于揭開(kāi)函數(shù)的真面目!1/26/2022整理課件4 結(jié)構(gòu)化程序設(shè)計(jì)基本思想:結(jié)構(gòu)化程序設(shè)計(jì)基本思想: 將一個(gè)大的程序按功能分割成一些子模塊,將一個(gè)大的程序按功能分割成一些子模塊,再通過(guò)對(duì)這些子模塊的組織和調(diào)用,來(lái)實(shí)現(xiàn)整個(gè)再通過(guò)對(duì)這些子模塊的組織和調(diào)用,來(lái)實(shí)現(xiàn)整個(gè)程序的功能要求。程序的功能要求。1/26/2022整理課件5#include stdio.h void main( ) float a,b,c,v; scanf(”%f,%f,%f”,&
3、a,&b,&c); v=volume(a,b,c); print_message( ); float volume(float a,float b,float c) float v; v=a*b*c; return(v); void print_message( ) printf(”v=%f”,v); 示例:編程序計(jì)算一立方體的體積,并在屏幕上輸出。示例:編程序計(jì)算一立方體的體積,并在屏幕上輸出。1/26/2022整理課件6 結(jié)構(gòu)化程序設(shè)計(jì)特點(diǎn):結(jié)構(gòu)化程序設(shè)計(jì)特點(diǎn):各模塊相對(duì)獨(dú)立、功能單一、結(jié)構(gòu)清晰;各模塊相對(duì)獨(dú)立、功能單一、結(jié)構(gòu)清晰;控制了程序設(shè)計(jì)的復(fù)雜性;控制了程序設(shè)計(jì)的復(fù)
4、雜性;提高元件的可靠性提高元件的可靠性縮短開(kāi)發(fā)周期;縮短開(kāi)發(fā)周期;避免程序開(kāi)發(fā)的重復(fù)勞動(dòng);避免程序開(kāi)發(fā)的重復(fù)勞動(dòng);易于維護(hù)和功能擴(kuò)充;易于維護(hù)和功能擴(kuò)充;開(kāi)發(fā)方法開(kāi)發(fā)方法: : 自上向下,逐步求精自上向下,逐步求精 ,模塊化,模塊化 ,限限制使用制使用gotogoto語(yǔ)句。語(yǔ)句。 1/26/2022整理課件7 1.1. 程序的三種基本結(jié)構(gòu)程序的三種基本結(jié)構(gòu) AB條件條件AB真真假假條件條件A假假真真1/26/2022整理課件82. C2. C語(yǔ)言語(yǔ)言是模塊化程序設(shè)計(jì)語(yǔ)言是模塊化程序設(shè)計(jì)語(yǔ)言C C程序結(jié)構(gòu)程序結(jié)構(gòu)A AB BC CD DE EF FG GH HI I1/26/2022整理課件93
5、.3.程序設(shè)計(jì)采用自頂向下逐步細(xì)化過(guò)程程序設(shè)計(jì)采用自頂向下逐步細(xì)化過(guò)程 工資計(jì)算程序工資計(jì)算程序工資計(jì)算工資計(jì)算信息輸入信息輸入工資額計(jì)算工資額計(jì)算工資表打印工資表打印應(yīng)發(fā)部分應(yīng)發(fā)部分扣除部分扣除部分基本工資基本工資其他補(bǔ)貼其他補(bǔ)貼水電、公積金水電、公積金1/26/2022整理課件10 函數(shù)是函數(shù)是C語(yǔ)言程序的一種基本組成部分,語(yǔ)言程序的一種基本組成部分, C語(yǔ)言程序的功能是通過(guò)函數(shù)之間的調(diào)用來(lái)實(shí)語(yǔ)言程序的功能是通過(guò)函數(shù)之間的調(diào)用來(lái)實(shí) 現(xiàn),一個(gè)完整的現(xiàn),一個(gè)完整的C語(yǔ)言程序可由一個(gè)或多個(gè)函語(yǔ)言程序可由一個(gè)或多個(gè)函 數(shù)組成。數(shù)組成。 0;-x) y=y*x; return(y); 傳統(tǒng)式傳統(tǒng)式例
6、例 有參函數(shù)有參函數(shù) long facto(int x) long y; for(y=1;x0;-x) y=y*x; return(y); 現(xiàn)代式現(xiàn)代式函數(shù)類(lèi)型函數(shù)類(lèi)型 函數(shù)名函數(shù)名(形參類(lèi)型說(shuō)明表形參類(lèi)型說(shuō)明表)說(shuō)明部分說(shuō)明部分語(yǔ)句部分語(yǔ)句部分現(xiàn)代格式現(xiàn)代格式函數(shù)返回值類(lèi)型函數(shù)返回值類(lèi)型缺省缺省 int 型型無(wú)返回值無(wú)返回值 void合法標(biāo)識(shí)符合法標(biāo)識(shí)符可以為空可以為空也可以有多個(gè)參數(shù)也可以有多個(gè)參數(shù)函數(shù)體函數(shù)體例例 無(wú)參函數(shù)無(wú)參函數(shù) void print_message( ) printf(”v=%f”,v); 例例 空函數(shù)空函數(shù)myfile( ) 函數(shù)體為空函數(shù)體為空1/26/2022整
7、理課件14 一一. .函數(shù)調(diào)用格式及執(zhí)行過(guò)程函數(shù)調(diào)用格式及執(zhí)行過(guò)程 調(diào)用形式調(diào)用形式函數(shù)名函數(shù)名(實(shí)參列表實(shí)參列表);說(shuō)明:說(shuō)明:實(shí)參與形參實(shí)參與形參個(gè)數(shù)相等,類(lèi)型一致,按順序一一對(duì)應(yīng)個(gè)數(shù)相等,類(lèi)型一致,按順序一一對(duì)應(yīng);實(shí)參列表求值順序,因系統(tǒng)而定實(shí)參列表求值順序,因系統(tǒng)而定(Turbo C 自右向左自右向左);實(shí)參的量可以是常量、有值的變量或運(yùn)算表達(dá)式實(shí)參的量可以是常量、有值的變量或運(yùn)算表達(dá)式. 1/26/2022整理課件15#include stdio.h void main( ) int i=1,n; n=f(i,+i); printf(”nn=%dn”,n); f(int a,int
8、b) int c; if(a=b) c=1; else c=0; return(c); #include stdio.h void main( ) int i=1,n; n=f(i,+i); printf(”nn=%dn”,n); f(int a,int b) int c; if(a=b) c=1; else c=0; return(c); 【例【例6_3】 實(shí)參求值順序舉例。實(shí)參求值順序舉例。 運(yùn)行結(jié)果:運(yùn)行結(jié)果:n=0 運(yùn)行結(jié)果:運(yùn)行結(jié)果:n=1 i(1),+i(2)a(1),b(2)c=0;i(2),+i(2)a(2),b(2)c=1;1/26/2022整理課件16函數(shù)調(diào)用語(yǔ)句的執(zhí)行過(guò)程
9、:函數(shù)調(diào)用語(yǔ)句的執(zhí)行過(guò)程: 首先計(jì)算每個(gè)實(shí)參表達(dá)式的首先計(jì)算每個(gè)實(shí)參表達(dá)式的值,并把此值存入所對(duì)應(yīng)值,并把此值存入所對(duì)應(yīng) 的形參單元中,的形參單元中, 執(zhí)行流程轉(zhuǎn)入函數(shù)體,執(zhí)行函數(shù)體中的各語(yǔ)句。執(zhí)行流程轉(zhuǎn)入函數(shù)體,執(zhí)行函數(shù)體中的各語(yǔ)句。 函數(shù)體執(zhí)行完之后,函數(shù)體執(zhí)行完之后,return (c)return (c)返回到調(diào)用該函數(shù)的返回到調(diào)用該函數(shù)的 函數(shù)中的調(diào)用處的下一條語(yǔ)函數(shù)中的調(diào)用處的下一條語(yǔ)/*計(jì)算面積計(jì)算面積*/ #include stdio.h void main( ) int x=5,y=4,s=0; s=f(x,y); printf(”ns=%dn”,s); f(int a,in
10、t b) c=a*b; return(c); x=5y=4a=5b=4c=5*4=20s=20運(yùn)行結(jié)果:運(yùn)行結(jié)果:s=20 1/26/2022整理課件17二二. . 函函 數(shù)數(shù) 的的 調(diào)調(diào) 用用 方方 式式 3. 以函數(shù)調(diào)用中的一個(gè)實(shí)際參數(shù)形式調(diào)用以函數(shù)調(diào)用中的一個(gè)實(shí)際參數(shù)形式調(diào)用 例如例如 k=hust(hust(m,n),j); printf(”%d”,power(a,b); 2. 以函數(shù)表達(dá)式的一個(gè)運(yùn)算對(duì)象形式調(diào)用以函數(shù)表達(dá)式的一個(gè)運(yùn)算對(duì)象形式調(diào)用 例如例如 k=hust(m,n)*hust(i,j); 1. 以函數(shù)調(diào)用語(yǔ)句形式調(diào)用以函數(shù)調(diào)用語(yǔ)句形式調(diào)用例如例如 hust( ); 1/2
11、6/2022整理課件18三三. .對(duì)被調(diào)用函數(shù)的使用說(shuō)明對(duì)被調(diào)用函數(shù)的使用說(shuō)明 在程序中調(diào)用另一個(gè)函數(shù)時(shí),要滿(mǎn)足以下三個(gè)條件在程序中調(diào)用另一個(gè)函數(shù)時(shí),要滿(mǎn)足以下三個(gè)條件: 被調(diào)用函數(shù)可以是已存在的用戶(hù)自定義函數(shù)或庫(kù)函數(shù)。被調(diào)用函數(shù)可以是已存在的用戶(hù)自定義函數(shù)或庫(kù)函數(shù)。 #include stdio.h void main( ) int x=5,y=4,s=0; s=f(x,y); printf(”ns=%dn”,s); f(int a,int b) c=a*b; return(c); 用戶(hù)自定義函數(shù)用戶(hù)自定義函數(shù)庫(kù)函數(shù)庫(kù)函數(shù) 若是庫(kù)函數(shù),應(yīng)用若是庫(kù)函數(shù),應(yīng)用#include命令將有關(guān)庫(kù)函數(shù)所需
12、的信息包含到本文件中命令將有關(guān)庫(kù)函數(shù)所需的信息包含到本文件中 #include stdio.h void main( ) printf( “*”); 若是用戶(hù)自定義的函數(shù),且該函數(shù)與調(diào)用它的函數(shù)若是用戶(hù)自定義的函數(shù),且該函數(shù)與調(diào)用它的函數(shù)(即調(diào)用函數(shù)即調(diào)用函數(shù))在同一個(gè)源在同一個(gè)源文件中,則在調(diào)用函數(shù)中應(yīng)對(duì)被調(diào)用函數(shù)返回值的類(lèi)型加以說(shuō)明。文件中,則在調(diào)用函數(shù)中應(yīng)對(duì)被調(diào)用函數(shù)返回值的類(lèi)型加以說(shuō)明。 1/26/2022整理課件19#include stdio.h void main( ) float volume(float a,float b,float c) float x,y,z,v; sc
13、anf(”%f%f%f”,&x,&y,&z); v=volume(x,y,z); printf(”v=%fn”,v); float volume(float a,float b,float c) float d; d=a*b*c; return(d); 【例【例6_4】 求長(zhǎng)方形體積的程序。求長(zhǎng)方形體積的程序。 對(duì)自定義函數(shù)對(duì)自定義函數(shù)volume說(shuō)明說(shuō)明 調(diào)用自定義函調(diào)用自定義函數(shù)數(shù)volume 1/26/2022整理課件20 n返回語(yǔ)句形式返回語(yǔ)句形式return(表達(dá)式表達(dá)式);說(shuō)明:說(shuō)明:l系統(tǒng)默認(rèn)的返回值類(lèi)型為系統(tǒng)默認(rèn)的返回值類(lèi)型為int型型 l當(dāng)函數(shù)有返回值
14、時(shí),凡是允許表達(dá)式出現(xiàn)的地方,都可以調(diào)用該函數(shù)當(dāng)函數(shù)有返回值時(shí),凡是允許表達(dá)式出現(xiàn)的地方,都可以調(diào)用該函數(shù) l當(dāng)函數(shù)沒(méi)有返回值時(shí),函數(shù)的返回值類(lèi)型可以說(shuō)明為當(dāng)函數(shù)沒(méi)有返回值時(shí),函數(shù)的返回值類(lèi)型可以說(shuō)明為void型型(空類(lèi)型空類(lèi)型)l若無(wú)若無(wú)return語(yǔ)句,遇語(yǔ)句,遇 時(shí),自動(dòng)返回調(diào)用函數(shù)時(shí),自動(dòng)返回調(diào)用函數(shù)l函數(shù)中可有多個(gè)函數(shù)中可有多個(gè)return語(yǔ)句語(yǔ)句或或return 表達(dá)式;表達(dá)式;或或return ;n功能功能:利用利用return語(yǔ)句,將計(jì)算結(jié)果語(yǔ)句,將計(jì)算結(jié)果(或不帶結(jié)果或不帶結(jié)果)返回給調(diào)用程序,返回給調(diào)用程序,同時(shí),也使程序的執(zhí)行流程轉(zhuǎn)到調(diào)用語(yǔ)句的下一語(yǔ)句去執(zhí)行。同時(shí),也使程
15、序的執(zhí)行流程轉(zhuǎn)到調(diào)用語(yǔ)句的下一語(yǔ)句去執(zhí)行。1/26/2022整理課件21 float count(int n) int i; float s; if(n=0); printf(”The%d is invalid”,n); return(0); else s=0; for(i=1;i=n;i+) s+=1/(float)i; return(s); 【例【例6_5】編一函數(shù),求編一函數(shù),求112131n的值。的值。 強(qiáng)制轉(zhuǎn)換成實(shí)型強(qiáng)制轉(zhuǎn)換成實(shí)型 1/26/2022整理課件22 void spc(int n) int i; for(i=0;in;i+) printf(”%c”, ); return(
16、0); 【例【例6_6】 打印打印n個(gè)空格的函數(shù)。個(gè)空格的函數(shù)。 void spc(int n) int i; for(i=0;in;i+) printf(”%c”, ); 返回調(diào)用函數(shù)返回調(diào)用函數(shù) 或或1/26/2022整理課件23void line(int n) line(int n) int i; for(i=1;i=n;i+) printf(”%c”,-); return; 調(diào)用該函數(shù):調(diào)用該函數(shù): printf(”%d”,line(30); 當(dāng)無(wú)返回值的函數(shù)將當(dāng)無(wú)返回值的函數(shù)將void省掉時(shí),省掉時(shí), 函數(shù)將返回一個(gè)不確定的值。函數(shù)將返回一個(gè)不確定的值。例如例如: 輸出一段虛線(xiàn)的輸出
17、一段虛線(xiàn)的同時(shí),還輸出同時(shí),還輸出line函數(shù)的返回函數(shù)的返回值值,它是一個(gè)不它是一個(gè)不確定的值。確定的值。引起編譯錯(cuò)誤引起編譯錯(cuò)誤 1/26/2022整理課件24 double power(float x,int n) int i; double pw; pw=l; for(i=1;i=n;i+) pw*=x; return pw; 【例【例6_7】編一函數(shù)編一函數(shù),求求x的的n次方的值次方的值,其中其中n是整數(shù)是整數(shù)。 將將 x、n 做為做為函數(shù)參數(shù)函數(shù)參數(shù) 結(jié)果通過(guò)結(jié)果通過(guò)return語(yǔ)句語(yǔ)句返回調(diào)用程序返回調(diào)用程序 1/26/2022整理課件25 to_str(int n) char
18、str10; int i; if(n0); while(-i=0) putchar(stri); 【例【例6_8】將一個(gè)給定的整數(shù)轉(zhuǎn)換成相應(yīng)的字符串后顯示出來(lái)。將一個(gè)給定的整數(shù)轉(zhuǎn)換成相應(yīng)的字符串后顯示出來(lái)。 將數(shù)值型的數(shù)據(jù)將數(shù)值型的數(shù)據(jù)轉(zhuǎn)換成數(shù)值字符轉(zhuǎn)換成數(shù)值字符的內(nèi)碼的內(nèi)碼 1/26/2022整理課件26正確的形參定義正確的形參定義 int hust(a,b) int a,b; int hust(int a,int b)或或錯(cuò)誤的形參定義錯(cuò)誤的形參定義 int hust(int a,b) int b; int hust(int a,b)或或 n形式參數(shù):定義函數(shù)時(shí)函數(shù)名后面括號(hào)中的變量名。形
19、式參數(shù):定義函數(shù)時(shí)函數(shù)名后面括號(hào)中的變量名。n實(shí)際參數(shù):調(diào)用函數(shù)時(shí)函數(shù)名后面括號(hào)中的表達(dá)式。實(shí)際參數(shù):調(diào)用函數(shù)時(shí)函數(shù)名后面括號(hào)中的表達(dá)式。例如例如n形參與實(shí)參形參與實(shí)參實(shí)參的定義實(shí)參的定義 s=hust(x,y); 1/26/2022整理課件27/*計(jì)算面積計(jì)算面積*/ #include stdio.h void main( ) int x=5,y=4,s=0; s=f(x,y); printf(”ns=%dn”,s); f(int a,int b) c=a*b; return(c); 實(shí)參實(shí)參 形參形參 s=f(x,y);(main 函數(shù)函數(shù))(f 函數(shù)函數(shù))f(int a,int b)c=
20、a*b; return(c); 1/26/2022整理課件28 n形式參數(shù):定義函數(shù)時(shí)函數(shù)名后面括號(hào)中的變量名。形式參數(shù):定義函數(shù)時(shí)函數(shù)名后面括號(hào)中的變量名。n實(shí)際參數(shù):調(diào)用函數(shù)時(shí)函數(shù)名后面括號(hào)中的表達(dá)式。實(shí)際參數(shù):調(diào)用函數(shù)時(shí)函數(shù)名后面括號(hào)中的表達(dá)式。n形參與實(shí)參形參與實(shí)參說(shuō)明:說(shuō)明:l實(shí)參可以是常量、已賦值的變量或表達(dá)式。實(shí)參可以是常量、已賦值的變量或表達(dá)式。l實(shí)參在次序、類(lèi)型和個(gè)數(shù)上應(yīng)與相應(yīng)形參表中的形參保持一致。實(shí)參在次序、類(lèi)型和個(gè)數(shù)上應(yīng)與相應(yīng)形參表中的形參保持一致。 l通常,當(dāng)需要從調(diào)用函數(shù)中傳值通常,當(dāng)需要從調(diào)用函數(shù)中傳值(或傳地址或傳地址)到被調(diào)用函數(shù)中的形參時(shí)到被調(diào)用函數(shù)中的形參
21、時(shí)應(yīng)設(shè)置實(shí)參。應(yīng)設(shè)置實(shí)參。1/26/2022整理課件29 n值的傳遞值的傳遞 :調(diào)用函數(shù)將實(shí)參:調(diào)用函數(shù)將實(shí)參(常數(shù)、變量、數(shù)組元素或可計(jì)算常數(shù)、變量、數(shù)組元素或可計(jì)算的表達(dá)式的表達(dá)式)的值傳遞到被調(diào)用函數(shù)形參設(shè)置的臨時(shí)變量存儲(chǔ)的值傳遞到被調(diào)用函數(shù)形參設(shè)置的臨時(shí)變量存儲(chǔ)單元中,被調(diào)用函數(shù)形參值的改變對(duì)調(diào)用函數(shù)的實(shí)參沒(méi)有單元中,被調(diào)用函數(shù)形參值的改變對(duì)調(diào)用函數(shù)的實(shí)參沒(méi)有影響。調(diào)用結(jié)束后,形參存儲(chǔ)單元被釋放,實(shí)參仍保持原影響。調(diào)用結(jié)束后,形參存儲(chǔ)單元被釋放,實(shí)參仍保持原值不變。值不變。 n傳遞形參值的兩種方法傳遞形參值的兩種方法 n特點(diǎn)特點(diǎn) :l形參與實(shí)參占用形參與實(shí)參占用不同不同的內(nèi)存單元的內(nèi)存
22、單元.l單向單向傳遞傳遞1/26/2022整理課件30#include stdio.h void main( ) int i=25; printf(”The value of i in main( ) before calling sqr(x) is %dn”,i); printf(”Calling sqr(x):sqr(%d)=%dn”,i, sqr(i) ); printf(”The value of i in main( ) after calling sqr(x) is %dn”,i); sqr(int x) x=x*x; return(x); 【例【例6_9】值的傳遞程序舉例值的傳遞
23、程序舉例 實(shí)參值復(fù)制給形參實(shí)參值復(fù)制給形參25i:調(diào)用前:調(diào)用前:調(diào)用:調(diào)用:25x:25i: 運(yùn)行結(jié)果:運(yùn)行結(jié)果: The value of i in main( ) before calling sqr(x) is 25 Calling sqr(x):sqr(25)=625 The value of i in main( ) after calling sqr(x) is 25sqr:25i:6252525x:25i:調(diào)用結(jié)束:調(diào)用結(jié)束: 結(jié)論:結(jié)論: 在值的傳遞調(diào)用中,只是實(shí)參的復(fù)制值被傳遞,在值的傳遞調(diào)用中,只是實(shí)參的復(fù)制值被傳遞, 被調(diào)用函數(shù)中的操作不會(huì)影響實(shí)參的值。被調(diào)用函數(shù)中的操
24、作不會(huì)影響實(shí)參的值。1/26/2022整理課件31 n地址的傳遞地址的傳遞 :調(diào)用函數(shù)將實(shí)參:調(diào)用函數(shù)將實(shí)參(數(shù)組名或指針型變量數(shù)組名或指針型變量)的地址的地址作為參數(shù)傳遞給形參。若實(shí)參是數(shù)組名,則調(diào)用函數(shù)將實(shí)參作為參數(shù)傳遞給形參。若實(shí)參是數(shù)組名,則調(diào)用函數(shù)將實(shí)參數(shù)組的起始地址傳遞給形參的臨時(shí)變量單元;若實(shí)參是指針數(shù)組的起始地址傳遞給形參的臨時(shí)變量單元;若實(shí)參是指針變量或地址表達(dá)式,則調(diào)用函數(shù)將實(shí)參指針變量所指向單元變量或地址表達(dá)式,則調(diào)用函數(shù)將實(shí)參指針變量所指向單元的地址或?qū)崊⒌牡刂穫鬟f給形參的臨時(shí)變量存儲(chǔ)單元。的地址或?qū)崊⒌牡刂穫鬟f給形參的臨時(shí)變量存儲(chǔ)單元。 n傳遞形參值的兩種方法傳遞形參
25、值的兩種方法 n特點(diǎn)特點(diǎn) :l形參與實(shí)參占用形參與實(shí)參占用相同相同的內(nèi)存單元的內(nèi)存單元.l雙向雙向傳遞傳遞l實(shí)參和形參必須是實(shí)參和形參必須是地址地址常量或變量常量或變量1/26/2022整理課件32void f(int b ) int max,max_i,i; max=b0,max_i=0; for(i=0;i10;i+) if(maxbi) max=bi;max_i=i; max=b0; b0=bmax_i; bmax_i=max; return; #include stdio.h void main( ) void f(int b ); int a10,i; for(i=0;i10;i+)
26、 scanf(”%d”,&ai); f(a); for(i=0;i10;i+) printf(”n%4d”,ai); 【例【例6_11】將數(shù)組中的最大元素值與第一個(gè)元素值交換】將數(shù)組中的最大元素值與第一個(gè)元素值交換 運(yùn)行結(jié)果:運(yùn)行結(jié)果: 0 1 2 3 4 5 6 7 8 9 9 1 2 3 4 5 6 7 8 0 調(diào)用前調(diào)用前0a9b調(diào)用調(diào)用0a9交換交換b9a0返回返回9a0 結(jié)論:結(jié)論: 在地址的傳遞調(diào)用中,數(shù)組在地址的傳遞調(diào)用中,數(shù)組b與數(shù)組與數(shù)組a共用同一存儲(chǔ)空間。共用同一存儲(chǔ)空間。 所以被傳遞的數(shù)據(jù)在被調(diào)用函數(shù)中對(duì)存儲(chǔ)空間的值做出某種所以被傳遞的數(shù)據(jù)在被調(diào)用函數(shù)中對(duì)存儲(chǔ)空間
27、的值做出某種 變動(dòng)后,必然會(huì)影響到使用該空間的調(diào)用函數(shù)中變量的值。變動(dòng)后,必然會(huì)影響到使用該空間的調(diào)用函數(shù)中變量的值。 實(shí)參數(shù)組的實(shí)參數(shù)組的起始地址起始地址傳遞給形參傳遞給形參1/26/2022整理課件33 一、一、非數(shù)組名作為函數(shù)參數(shù)非數(shù)組名作為函數(shù)參數(shù) n參數(shù)傳遞的兩種形式參數(shù)傳遞的兩種形式 當(dāng)非數(shù)組名作為函數(shù)參數(shù),在函數(shù)調(diào)用時(shí),當(dāng)非數(shù)組名作為函數(shù)參數(shù),在函數(shù)調(diào)用時(shí),C語(yǔ)言語(yǔ)言編譯系統(tǒng)根據(jù)形參的類(lèi)型為每個(gè)形參分配存儲(chǔ)單元,并編譯系統(tǒng)根據(jù)形參的類(lèi)型為每個(gè)形參分配存儲(chǔ)單元,并將實(shí)參的值復(fù)制到對(duì)應(yīng)的形參單元之中,形參和實(shí)參分將實(shí)參的值復(fù)制到對(duì)應(yīng)的形參單元之中,形參和實(shí)參分別占用不同的存儲(chǔ)單元,且
28、形參值的改變不影響與其對(duì)別占用不同的存儲(chǔ)單元,且形參值的改變不影響與其對(duì)應(yīng)的實(shí)參,即按應(yīng)的實(shí)參,即按“值的傳遞值的傳遞”方法操作。方法操作。 1/26/2022整理課件34 f(int a,int b) a=a+2; b=b+4; printf(”a=%d,b=%dn”,a,b); return(a); #include stdio.h void main( ) int f(int a,int b); int x=1,y=2,z; static int a =0,1,2,3,4; z= f(x,y) ; printf(”z=%d,x=%d,y=%dn”,z,x,y); z= f(a3,a4);
29、 printf(”z=%d,a3=%d,a4=%dn” ,z,a3,a4); z= f(x,y+1); printf(”z=%d,x=%d,y=%dn”,z,x,y); 【例【例6_12】非數(shù)組名作為參數(shù)的值的傳遞程序舉例非數(shù)組名作為參數(shù)的值的傳遞程序舉例 運(yùn)行結(jié)果:運(yùn)行結(jié)果: a=3,b=6 z=3,x=1,y=2a=5,b=8 z=5,a3=3,a4=4a=3,b=7 z=3,x=1,y=21/26/2022整理課件35 二、二、數(shù)組名作為函數(shù)參數(shù)數(shù)組名作為函數(shù)參數(shù) n參數(shù)傳遞的兩種形式參數(shù)傳遞的兩種形式 單個(gè)數(shù)組元素可以作為函數(shù)參數(shù),這同非數(shù)組名作為單個(gè)數(shù)組元素可以作為函數(shù)參數(shù),這同非數(shù)
30、組名作為函數(shù)參數(shù)的情形完全一樣,即遵守函數(shù)參數(shù)的情形完全一樣,即遵守”值傳遞值傳遞”方式。方式。 1/26/2022整理課件361 1、數(shù)組名作為函數(shù)參數(shù)的表示方法數(shù)組名作為函數(shù)參數(shù)的表示方法 當(dāng)數(shù)組名作為函數(shù)參數(shù)時(shí),需要對(duì)其類(lèi)型進(jìn)行相應(yīng)的說(shuō)明當(dāng)數(shù)組名作為函數(shù)參數(shù)時(shí),需要對(duì)其類(lèi)型進(jìn)行相應(yīng)的說(shuō)明 例如例如 int test(int array10) . 若數(shù)組說(shuō)明時(shí)不指定數(shù)組的長(zhǎng)度若數(shù)組說(shuō)明時(shí)不指定數(shù)組的長(zhǎng)度 ,可用另一個(gè)參數(shù)來(lái)表示數(shù)組的長(zhǎng)度,可用另一個(gè)參數(shù)來(lái)表示數(shù)組的長(zhǎng)度 例如例如 int test(int array,int n ) . 用形參用形參n來(lái)表示來(lái)表示array數(shù)組的實(shí)數(shù)組的實(shí)際
31、長(zhǎng)度,更靈活際長(zhǎng)度,更靈活1/26/2022整理課件37int solve( int a ,int n) int sum,i; sum=0; for(i=0;in;i+) if(ai!=0) sum+; return(sum); 【例【例6_13】編一函數(shù)編一函數(shù),用來(lái)統(tǒng)計(jì)一個(gè)一維數(shù)組中用來(lái)統(tǒng)計(jì)一個(gè)一維數(shù)組中非非0元素的個(gè)數(shù)元素的個(gè)數(shù)用形參用形參n來(lái)表示來(lái)表示a數(shù)組的實(shí)際長(zhǎng)度。數(shù)組的實(shí)際長(zhǎng)度。1/26/2022整理課件381 1、數(shù)組名作為函數(shù)參數(shù)的表示方法數(shù)組名作為函數(shù)參數(shù)的表示方法 l 當(dāng)多維數(shù)組名作為函數(shù)參數(shù)時(shí),除第一維可以不指定長(zhǎng)當(dāng)多維數(shù)組名作為函數(shù)參數(shù)時(shí),除第一維可以不指定長(zhǎng)度外,其
32、余各維都必須指定長(zhǎng)度。度外,其余各維都必須指定長(zhǎng)度。例如例如 check(float a 10,float n) . 下面的參數(shù)說(shuō)明都是不正確的:下面的參數(shù)說(shuō)明都是不正確的: 例如例如 float a ; 或或 float a10 ; . 1/26/2022整理課件39說(shuō)明:說(shuō)明: 用數(shù)組名作為函數(shù)參數(shù)時(shí),應(yīng)該在調(diào)用函數(shù)和被調(diào)用函數(shù)用數(shù)組名作為函數(shù)參數(shù)時(shí),應(yīng)該在調(diào)用函數(shù)和被調(diào)用函數(shù) 中分別定義數(shù)組。中分別定義數(shù)組。 實(shí)參數(shù)組和形參數(shù)組類(lèi)型應(yīng)一致,否則出錯(cuò)。實(shí)參數(shù)組和形參數(shù)組類(lèi)型應(yīng)一致,否則出錯(cuò)。 形參數(shù)組的大小應(yīng)大于等于實(shí)參數(shù)組的大小,否則得不到形參數(shù)組的大小應(yīng)大于等于實(shí)參數(shù)組的大小,否則得不
33、到 實(shí)參數(shù)組的全部值。實(shí)參數(shù)組的全部值。 特別注意的是,數(shù)組名作為函數(shù)參數(shù)時(shí),是將實(shí)參數(shù)組特別注意的是,數(shù)組名作為函數(shù)參數(shù)時(shí),是將實(shí)參數(shù)組 的首地址傳給形參數(shù)組,兩數(shù)組的對(duì)應(yīng)元素占用同一內(nèi)的首地址傳給形參數(shù)組,兩數(shù)組的對(duì)應(yīng)元素占用同一內(nèi) 存單元。傳遞時(shí)按數(shù)組在內(nèi)存中排列的順序進(jìn)行。存單元。傳遞時(shí)按數(shù)組在內(nèi)存中排列的順序進(jìn)行。1/26/2022整理課件402 2、數(shù)組名作為函數(shù)參數(shù)的傳遞方式數(shù)組名作為函數(shù)參數(shù)的傳遞方式 數(shù)組名作為函數(shù)參數(shù)時(shí),不是采用數(shù)組名作為函數(shù)參數(shù)時(shí),不是采用“值傳遞值傳遞”方式,方式, 而是采用而是采用“地址傳遞地址傳遞”方式。方式。 這意味著形參數(shù)組中某一元素的改變,將直
34、接影響到這意味著形參數(shù)組中某一元素的改變,將直接影響到 與其對(duì)應(yīng)的實(shí)參數(shù)組中的元素。與其對(duì)應(yīng)的實(shí)參數(shù)組中的元素。 1/26/2022整理課件41void sort(int array10) int i,j,k,t; for(i=0;i9;i+) k=i; for(j=i+1;j10;j+) if(arrayjarrayk) k=j; t=arrayk;arrayk=arrayi; arrayi=t; #include stdio.h void main( ) int x10,i; void sort(int array10); for(i=0;i10;i+) scanf(”%d,”,&
35、xi); sort(x); printf(”The sorted array:n”); for(i=0;i10;i+) printf(”%d,”,xi); printf(”n”); 【例【例6_146_14】將一個(gè)將一個(gè)1010個(gè)元素的一維數(shù)組用函數(shù)調(diào)用實(shí)現(xiàn)選擇排序。個(gè)元素的一維數(shù)組用函數(shù)調(diào)用實(shí)現(xiàn)選擇排序。 9,8,7,6,5,4,3,2,1,0 The sorted array: 0,1,2,3,4,5,6,7,8,9調(diào)用前調(diào)用前9x009 調(diào)用調(diào)用9x009array 交換交換0 x909array 返回返回0 x909scanf(”%d,”,&xi);尋尋找找排排序序1/26/2
36、022整理課件42 C語(yǔ)言中的函數(shù)定義是互相獨(dú)立的,函數(shù)和函數(shù)之間語(yǔ)言中的函數(shù)定義是互相獨(dú)立的,函數(shù)和函數(shù)之間沒(méi)有從屬關(guān)系,即一個(gè)函數(shù)內(nèi)不允許包含另一個(gè)函數(shù)的定沒(méi)有從屬關(guān)系,即一個(gè)函數(shù)內(nèi)不允許包含另一個(gè)函數(shù)的定義。一個(gè)函數(shù)既可以被其他函數(shù)調(diào)用,同時(shí),它也可以調(diào)義。一個(gè)函數(shù)既可以被其他函數(shù)調(diào)用,同時(shí),它也可以調(diào)用別的函數(shù),這就是函數(shù)的嵌套調(diào)用。函數(shù)的嵌套調(diào)用為用別的函數(shù),這就是函數(shù)的嵌套調(diào)用。函數(shù)的嵌套調(diào)用為自頂向下、逐步求精及模塊化的結(jié)構(gòu)化程序設(shè)計(jì)技術(shù)提供自頂向下、逐步求精及模塊化的結(jié)構(gòu)化程序設(shè)計(jì)技術(shù)提供了最基本的支持。了最基本的支持。=0) break; result=fact(n) ; p
37、rintf(”Result=%ld”,result);【例【例6_166_16】 從鍵盤(pán)輸入一非負(fù)整數(shù)從鍵盤(pán)輸入一非負(fù)整數(shù)n,并求出,并求出n!的值。的值。n!=n*(n-1)!結(jié)果分析:結(jié)果分析:n=4 f(4)= 4*fac(4-1) =3 f(3)= 3*fac(3-1) =2 f(2)= 2*fac(2-1) =1 f(1)= 1*fact(1-1) =0 f(0)= 1回推回推遞推遞推運(yùn)行情況:運(yùn)行情況:Input a number: 4 Result =24遞歸調(diào)用遞歸調(diào)用嵌套調(diào)用嵌套調(diào)用if(n=0) /*遞歸終止條件遞歸終止條件*/ f=1;遞歸過(guò)程的兩個(gè)階段:遞歸過(guò)程的兩個(gè)階
38、段:是主函數(shù)調(diào)用的。在一次調(diào)用是主函數(shù)調(diào)用的。在一次調(diào)用函數(shù)時(shí)函數(shù)時(shí)并不是立即得到并不是立即得到的值,而是一次又一次地的值,而是一次又一次地進(jìn)行遞歸調(diào)用進(jìn)行遞歸調(diào)用(),直到,直到時(shí)才有確定的值。時(shí)才有確定的值。之后,再之后,再出出、 、 的值。的值。1/26/2022整理課件47double xpower(float x,int n) if(n=0) return(1); else return(x*xpower(x,n-1);#include stdio.h void main( ) double xpower(float x,int n); float x; int n; double
39、r scanf(”%f%d”,&x,&n); r=xpower(x,n); printf(”Result=%f”,r);【例【例6_17】編一程序,利用函數(shù)的遞歸調(diào)用求編一程序,利用函數(shù)的遞歸調(diào)用求x的的n次方的值,次方的值,其中其中n為正整數(shù)。為正整數(shù)。 運(yùn)行情況:運(yùn)行情況:2,3 Result =8 小結(jié):小結(jié):任何有意義的遞歸調(diào)用總是由兩部分組成:任何有意義的遞歸調(diào)用總是由兩部分組成:即即遞歸方式遞歸方式與與遞歸終止條件遞歸終止條件。 if(n=0) /*遞歸終止條件遞歸終止條件*/ return(1);1/26/2022整理課件48 n 變量是對(duì)程序中數(shù)據(jù)的存儲(chǔ)空間的抽
40、象變量是對(duì)程序中數(shù)據(jù)的存儲(chǔ)空間的抽象n 變量的屬性變量的屬性n數(shù)據(jù)類(lèi)型:變量所持有的數(shù)據(jù)的性質(zhì)(數(shù)據(jù)類(lèi)型:變量所持有的數(shù)據(jù)的性質(zhì)(操作屬性操作屬性)n存儲(chǔ)屬性存儲(chǔ)屬性l存儲(chǔ)器類(lèi)型:寄存器、靜態(tài)存儲(chǔ)區(qū)、動(dòng)態(tài)存儲(chǔ)區(qū)存儲(chǔ)器類(lèi)型:寄存器、靜態(tài)存儲(chǔ)區(qū)、動(dòng)態(tài)存儲(chǔ)區(qū)l生存期生存期:變量在某一時(shí)刻存在:變量在某一時(shí)刻存在 靜態(tài)變量與動(dòng)態(tài)變量靜態(tài)變量與動(dòng)態(tài)變量l作用域作用域:變量在某區(qū)域內(nèi)有效:變量在某區(qū)域內(nèi)有效 局部變量與全局變量局部變量與全局變量n 變量的存儲(chǔ)類(lèi)型變量的存儲(chǔ)類(lèi)型n auto 自動(dòng)型自動(dòng)型n register 寄存器型寄存器型n static 靜態(tài)型靜態(tài)型n extern 外部型外部型n 變量
41、定義格式:變量定義格式: 存儲(chǔ)類(lèi)型定義符存儲(chǔ)類(lèi)型定義符 數(shù)據(jù)類(lèi)型數(shù)據(jù)類(lèi)型 變量名表變量名表;如如: int sub; auto int x,y,z; register int n; static float a,b;1/26/2022整理課件49 定義定義在在 函數(shù)函數(shù) 或或 復(fù)合語(yǔ)句復(fù)合語(yǔ)句 內(nèi)部定義的變量稱(chēng)為內(nèi)部定義的變量稱(chēng)為 局部變量局部變量。 說(shuō)明說(shuō)明n主函數(shù)主函數(shù)main中定義的變量也只在主函數(shù)中有效,其它函數(shù)不能引用;中定義的變量也只在主函數(shù)中有效,其它函數(shù)不能引用;n不同函數(shù)中可以使用相同名字的變量,它們代表不同的對(duì)象,占用不同不同函數(shù)中可以使用相同名字的變量,它們代表不同的對(duì)象
42、,占用不同的內(nèi)存單元,互相獨(dú)立;的內(nèi)存單元,互相獨(dú)立;n形式參數(shù)形式參數(shù)也是局部變量;也是局部變量;n可以在可以在復(fù)合語(yǔ)句復(fù)合語(yǔ)句中定義變量,其作用域只是本復(fù)合語(yǔ)句。中定義變量,其作用域只是本復(fù)合語(yǔ)句。1/26/2022整理課件50 float hust1(int a) int x, y; 舉舉 例例局部變量局部變量a、x、y的作用范圍的作用范圍 float hust2(int b,int c) char s; 局部變量局部變量b、c、s的作用范圍的作用范圍void main( ) int m, n; 局部變量局部變量m、n的作用范圍的作用范圍1/26/2022整理課件51舉舉 例例#incl
43、ude ”stdio.h” void main( ) int p, q; int x; x=p+q; x 的有效范圍的有效范圍p、q的有效范圍的有效范圍1/26/2022整理課件52 1.自動(dòng)存儲(chǔ)變量自動(dòng)存儲(chǔ)變量 auto 在函數(shù)或復(fù)合語(yǔ)句中定義和說(shuō)明的變量,通常稱(chēng)為自動(dòng)在函數(shù)或復(fù)合語(yǔ)句中定義和說(shuō)明的變量,通常稱(chēng)為自動(dòng)變量。自動(dòng)變量前可以冠以變量。自動(dòng)變量前可以冠以“”,若變量前不加任何存,若變量前不加任何存儲(chǔ)類(lèi)別說(shuō)明儲(chǔ)類(lèi)別說(shuō)明 ,則按,則按缺省規(guī)則都為自動(dòng)存儲(chǔ)類(lèi)別缺省規(guī)則都為自動(dòng)存儲(chǔ)類(lèi)別的變量。的變量。作用域:作用域: 自動(dòng)變量通常是局部變量,它的作用域僅限于定義它的那自動(dòng)變量通常是局部變量
44、,它的作用域僅限于定義它的那個(gè)函數(shù)或復(fù)合語(yǔ)句。它的可見(jiàn)性與生存期和作用域相同。個(gè)函數(shù)或復(fù)合語(yǔ)句。它的可見(jiàn)性與生存期和作用域相同。 auto float a; float a;或或1/26/2022整理課件53【例【例6_18】 不同函數(shù)中的同名變量不同函數(shù)中的同名變量#include stdio.hvoid main( ) int a; a=0; data( ); a=a+100; printf(”main:a=%dn”,a);data( ) int a; a=-199; printf(”data:a=%dn”,a);運(yùn)行結(jié)果:運(yùn)行結(jié)果:data:a=-199main:a=100不指定為不指定
45、為auto型型不指定為不指定為auto型型#include stdio.hvoid main( ) int a; a=1; data( ); a=a+100; printf(”main:a=%dn”,a);data( ) int a; printf(“da=%dn,a); a=-199; printf(”data:a=%dn”,a);運(yùn)行結(jié)果:運(yùn)行結(jié)果: da=1 data:a=199 main:a=1011/26/2022整理課件54【例【例6_18】 不同函數(shù)中的同名變量不同函數(shù)中的同名變量#include stdio.hvoid main( ) int a; a=10; printf(“
46、ma=%d,%xn,a,&a); data( ); a=a+100; printf(”main:a=%dn”,a ,&a);data( ) int a; printf(“da=%dn,a ,&a); a+=1; printf(“daa=%d,%xn,a,&a); a=-199; printf(”data:a=%dn”,a ,&a);運(yùn)行結(jié)果:運(yùn)行結(jié)果:ma=10,ffdcda=404,ffd6daa=405,ffd6data:a =199,ffd6main:a=110,ffdc1/26/2022整理課件55 2. 靜態(tài)局部變量靜態(tài)局部變量 static
47、如果希望在函數(shù)調(diào)用結(jié)束后仍然保留函數(shù)中定義的局部如果希望在函數(shù)調(diào)用結(jié)束后仍然保留函數(shù)中定義的局部變量的值,則可以將該局部變量定義為靜態(tài)局部變量。變量的值,則可以將該局部變量定義為靜態(tài)局部變量。 靜態(tài)局部變量前可以冠以靜態(tài)局部變量前可以冠以“static ” 例如例如 static int t,s; 說(shuō)明:說(shuō)明:靜態(tài)局部變量的作用域在定義它的函數(shù)內(nèi)部,它的值在函靜態(tài)局部變量的作用域在定義它的函數(shù)內(nèi)部,它的值在函 數(shù)調(diào)用結(jié)束后并不消失,但其他函數(shù)仍然不能訪(fǎng)問(wèn)它。數(shù)調(diào)用結(jié)束后并不消失,但其他函數(shù)仍然不能訪(fǎng)問(wèn)它。靜態(tài)局部變量賦初值是在編譯過(guò)程中進(jìn)行的,靜態(tài)局部變量賦初值是在編譯過(guò)程中進(jìn)行的,且只賦一次
48、且只賦一次 初值初值。而且連續(xù)保留上一次函數(shù)調(diào)用時(shí)的結(jié)果。而且連續(xù)保留上一次函數(shù)調(diào)用時(shí)的結(jié)果。靜態(tài)局部變量的默認(rèn)初值數(shù)值型為靜態(tài)局部變量的默認(rèn)初值數(shù)值型為0,字符型為,字符型為Null1/26/2022整理課件56【例【例6_19】編一程序,觀(guān)察靜態(tài)局部變量在調(diào)編一程序,觀(guān)察靜態(tài)局部變量在調(diào)用過(guò)程中的情況。用過(guò)程中的情況。 #include stdio.h void test( ) static int a=0; printf(”a=%dn”,a); +a; void main( ) int i; for(i=0;i4;i+) test( ); 運(yùn)行結(jié)果:運(yùn)行結(jié)果: a=0 a=1a=2a=3
49、1/26/2022整理課件57#include int func(int a,int b) static int m=0, i=0; i+=m+1; m=i+a+b; return(m); main()() int k=3,m=2,p; p=func(k,m); printf(“p1=%dn”,p); p=func(k,m); printf(“p2=%dn”,p); 運(yùn)行結(jié)果:運(yùn)行結(jié)果:p1= 課堂練習(xí):課堂練習(xí):看程序?qū)懡Y(jié)果看程序?qū)懡Y(jié)果*i=i+(m+1)=0+(0+1)=1*m=1+3+2=6*i=i+(m+1)=1+(6+1)=8*m=8+3+2=13*6p2= 131/26/2022整
50、理課件58 3. 寄存器變量寄存器變量 register 為提高程序的運(yùn)行速度,可將使用十分頻繁的局部變量為提高程序的運(yùn)行速度,可將使用十分頻繁的局部變量說(shuō)明為寄存器變量,即在局部變量前冠以說(shuō)明為寄存器變量,即在局部變量前冠以register,告知編譯,告知編譯系統(tǒng)將其存儲(chǔ)在系統(tǒng)將其存儲(chǔ)在CPU的寄存器中的寄存器中 void test_r(register int n) register char c; . 說(shuō)明:說(shuō)明:變量的存儲(chǔ)類(lèi)型為寄存器變量時(shí),變量的存儲(chǔ)類(lèi)型為寄存器變量時(shí),auto說(shuō)明符可省,冠以說(shuō)明符可省,冠以register說(shuō)明符即可說(shuō)明符即可寄存器變量的使用與機(jī)器的硬件特性有關(guān),有
51、一些限制寄存器變量的使用與機(jī)器的硬件特性有關(guān),有一些限制:l如寄存器變量的個(gè)數(shù);如寄存器變量的個(gè)數(shù);l它只適用于自動(dòng)變量和函數(shù)的形參;它只適用于自動(dòng)變量和函數(shù)的形參;l它的類(lèi)型只能是它的類(lèi)型只能是char、short int、unsigned int、int和和指針型指針型;l不允許對(duì)寄存器變量取地址等。不允許對(duì)寄存器變量取地址等。 Turbo C中寄存器變量只能用于中寄存器變量只能用于整型整型和和字符型字符型,且限制最多只允許定義,且限制最多只允許定義兩個(gè)兩個(gè) 寄存器變量。一旦超過(guò),系統(tǒng)就自動(dòng)地將其余的作為非寄存器變量來(lái)處理。寄存器變量。一旦超過(guò),系統(tǒng)就自動(dòng)地將其余的作為非寄存器變量來(lái)處理。
52、 1/26/2022整理課件59i的作用范圍的作用范圍【例【例6_20】 輸出輸出1到到5的階乘的值。的階乘的值。 #include stdio.h void main( ) int fac(int n); int i; for(i=1;i=5;i+) printf(”%d!=%dn”,i,fac(i); int fac(int n) register int i,f=1; for(i=1;i=n;i+) f=f*i; return(f); 運(yùn)行結(jié)果:運(yùn)行結(jié)果: 1!=1 2!=23!=64!=24i、f的作用范圍的作用范圍5!=1201/26/2022整理課件60【例【例6_21】編一程序,
53、輸入編一程序,輸入10名學(xué)生的成績(jī),名學(xué)生的成績(jī),并求出平均成績(jī)并求出平均成績(jī) #include stdio.h float ascore(float a ,int n) register int i; float sum; sum=0; for(i=0;in;i+) sum+=ai; return(sum/n); void main( ) float array10; register int i; for(i=0;i10;i+) scanf(”%f”,&arrayi); printf(”Average score=%f”,; ascore(array,10);i的作用的作用范圍范圍
54、i的作用的作用范圍范圍1/26/2022整理課件61 定義定義一個(gè)源程序文件可以包含一個(gè)或若干個(gè)函數(shù)。一個(gè)源程序文件可以包含一個(gè)或若干個(gè)函數(shù)。在函數(shù)之外定義的變量稱(chēng)為全局變量或全程變量在函數(shù)之外定義的變量稱(chēng)為全局變量或全程變量(又稱(chēng)又稱(chēng)外部變量外部變量)。 全局變量全局變量與與局部變量局部變量的區(qū)別:的區(qū)別:l全局變量全局變量在函數(shù)之外定義,在函數(shù)之外定義,局部變量局部變量在函數(shù)之內(nèi)定義;在函數(shù)之內(nèi)定義;l局部變量局部變量在本函數(shù)之內(nèi)有效,在本函數(shù)之內(nèi)有效,全局變量全局變量從定義變量的位置開(kāi)始到本源文從定義變量的位置開(kāi)始到本源文件結(jié)束均有效。件結(jié)束均有效。l編譯時(shí)編譯時(shí)全局變量全局變量分配在靜
55、態(tài)存儲(chǔ)區(qū),而分配在靜態(tài)存儲(chǔ)區(qū),而局部變量局部變量則不一定則不一定。1/26/2022整理課件62【例【例6_22】編一程序,打印九九表編一程序,打印九九表 #include stdio.h void row(); int a=1; /*外部變量外部變量*/ void main( ) int k; for(k=1;k=9;+k,+a) row( ); void row( ) int b; for(b=1;b=a;+b) printf(”%4d”,a*b); printf(”n”); k的有效范圍的有效范圍b的有效范圍的有效范圍作用作用域域a1/26/2022整理課件63 1. 外部變量外部變量
56、extern 沒(méi)有說(shuō)明為沒(méi)有說(shuō)明為static的全局變量,其存儲(chǔ)類(lèi)型都是外部的,的全局變量,其存儲(chǔ)類(lèi)型都是外部的,統(tǒng)稱(chēng)為外部變量。統(tǒng)稱(chēng)為外部變量。注意:注意:凡在函數(shù)外定義的全局變量,按缺省規(guī)則可以不寫(xiě)說(shuō)明凡在函數(shù)外定義的全局變量,按缺省規(guī)則可以不寫(xiě)說(shuō)明externextern, 但在函數(shù)體內(nèi)說(shuō)明其后所定義的全局變量時(shí),要冠以但在函數(shù)體內(nèi)說(shuō)明其后所定義的全局變量時(shí),要冠以externextern。若一個(gè)文件要引用另一個(gè)文件中的全局變量,應(yīng)該在需要引用該若一個(gè)文件要引用另一個(gè)文件中的全局變量,應(yīng)該在需要引用該 變量的文件中,用變量的文件中,用 extern說(shuō)明該變量為外部的全局變量。說(shuō)明該變量為
57、外部的全局變量。1/26/2022整理課件64【例【例6_23】編一程序,打印九九表編一程序,打印九九表 #include stdio.hvoid row();void main( ) int k; for(k=1;k=9;+k,+a) row( ); int a=1; /*定義外部變量定義外部變量*/ void row ( ) int b; for(b=1;b=a;+b) printf(”%4d”,a*b); printf(”n”); 作用作用域域a作用作用域域a擴(kuò)展擴(kuò)展extern int a; /*說(shuō)明外部變量說(shuō)明外部變量*/externextern只能用來(lái)說(shuō)只能用來(lái)說(shuō)明變量,而不能用明
58、變量,而不能用來(lái)定義變量。來(lái)定義變量。 1/26/2022整理課件65 例如例如 在不同的文件中引用外部變量在不同的文件中引用外部變量 文件文件f1.c的內(nèi)容的內(nèi)容:# include “f2.c”int x; /*外部變量定義外部變量定義*/main() int sum,y; scanf(“%d”,&y); store(); sum=x+y; printf(“sum=%d”,sum);文件文件f2.c的內(nèi)容的內(nèi)容:extern int x; /*外部變量引用說(shuō)明外部變量引用說(shuō)明*/void store() x=10; 1/26/2022整理課件66 2. 靜態(tài)靜態(tài)外部變量外部變量 s
59、tatic 靜態(tài)全局變量一定是在本文件中定義的全局變量,其存靜態(tài)全局變量一定是在本文件中定義的全局變量,其存儲(chǔ)類(lèi)型說(shuō)明符是儲(chǔ)類(lèi)型說(shuō)明符是。 靜態(tài)全局變量的作用域是其靜態(tài)全局變量的作用域是其,在本文件外不能訪(fǎng)問(wèn)。在本文件外不能訪(fǎng)問(wèn)。 這種全局變量起到一個(gè)屏蔽作用。也可以對(duì)函數(shù)定義成這種全局變量起到一個(gè)屏蔽作用。也可以對(duì)函數(shù)定義成靜態(tài)的,來(lái)限制函數(shù)的作用域。靜態(tài)的,來(lái)限制函數(shù)的作用域。 靜態(tài)外部變量靜態(tài)外部變量與與外部變量外部變量的相同與區(qū)別:的相同與區(qū)別:兩者都是在兩者都是在靜態(tài)存儲(chǔ)區(qū)靜態(tài)存儲(chǔ)區(qū)中分配單元中分配單元;外部變量外部變量不僅在本函數(shù)之內(nèi)使用,還可以用于其他函數(shù)不僅在本函數(shù)之內(nèi)使用,還
60、可以用于其他函數(shù),但但靜態(tài)外部變量靜態(tài)外部變量則不能用于其他函數(shù);則不能用于其他函數(shù);1/26/2022整理課件67 例如例如 下面對(duì)靜態(tài)全局變量的引用是錯(cuò)誤的:下面對(duì)靜態(tài)全局變量的引用是錯(cuò)誤的: file1.c static int a; /*靜態(tài)外部變量定義靜態(tài)外部變量定義*/main() a=1; printf(”%dn”,f(a); extern int a; /*靜態(tài)外部變量引用說(shuō)明靜態(tài)外部變量引用說(shuō)明*/int f(int x) x=a+x; printf(”%dn”,x); return(x);即使使用了即使使用了externextern說(shuō)明,也無(wú)法使用說(shuō)明,也無(wú)法使用該變量。該變量。 1/26/2022整理課件68 C語(yǔ)言程序系統(tǒng)由若干個(gè)函數(shù)組成,這些語(yǔ)言程序系統(tǒng)由若干個(gè)函數(shù)組成,這些函數(shù)既可在同一文件中,也可分
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 五年級(jí)下冊(cè)數(shù)學(xué)聽(tīng)評(píng)課記錄《 分?jǐn)?shù)加減法簡(jiǎn)便運(yùn)算》人教新課標(biāo)
- 八年級(jí)道德與法治下冊(cè)第二單元理解權(quán)利義務(wù)第四課公民義務(wù)第二框依法履行義務(wù)聽(tīng)課評(píng)課記錄(新人教版)
- 湘教版數(shù)學(xué)九年級(jí)上冊(cè)《4.4解直角三角形的應(yīng)用(1)》聽(tīng)評(píng)課記錄
- 人教版歷史八年級(jí)下冊(cè)第15課《鋼鐵長(zhǎng)城》聽(tīng)課評(píng)課記錄
- 天天練習(xí)-四年級(jí)上冊(cè)口算練習(xí)
- 七年級(jí)下學(xué)期語(yǔ)文教學(xué)工作總結(jié)
- 蘇教版小學(xué)數(shù)學(xué)三年級(jí)上冊(cè)口算試題全套
- 蘇教版四年級(jí)數(shù)學(xué)下冊(cè)期末復(fù)習(xí)口算練習(xí)題三
- 滬科版八年級(jí)數(shù)學(xué)下冊(cè)聽(tīng)評(píng)課記錄《第17章一元二次方程數(shù)17.2一元二次方程的解法(第3課時(shí))》
- LED屏幕安裝協(xié)議書(shū)范本
- 華為攜手深圳國(guó)際會(huì)展中心創(chuàng)建世界一流展館
- 2023版思想道德與法治專(zhuān)題2 領(lǐng)悟人生真諦 把握人生方向 第3講 創(chuàng)造有意義的人生
- 全過(guò)程工程咨詢(xún)服務(wù)技術(shù)方案
- 小報(bào):人工智能科技科學(xué)小報(bào)手抄報(bào)電子小報(bào)word小報(bào)
- GB/T 41509-2022綠色制造干式切削工藝性能評(píng)價(jià)規(guī)范
- 企業(yè)生產(chǎn)現(xiàn)場(chǎng)6S管理知識(shí)培訓(xùn)課件
- 五年級(jí)下冊(cè)數(shù)學(xué)課件 第10課時(shí) 練習(xí)課 蘇教版(共11張PPT)
- 三年級(jí)道德與法治下冊(cè)我是獨(dú)特的
- 土木工程畢業(yè)設(shè)計(jì)(論文)-五層宿舍樓建筑結(jié)構(gòu)設(shè)計(jì)
- 青年卒中 幻燈
- 典型倒閘操作票
評(píng)論
0/150
提交評(píng)論