程序設(shè)計8PPT課件_第1頁
程序設(shè)計8PPT課件_第2頁
程序設(shè)計8PPT課件_第3頁
程序設(shè)計8PPT課件_第4頁
程序設(shè)計8PPT課件_第5頁
已閱讀5頁,還剩99頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、8.1 概述第1頁/共104頁舉一個函數(shù)調(diào)用的例子:main( ) printstar ( ); /*調(diào)用printstar函數(shù)* / print_message ( ); /*調(diào)用print_message函數(shù)* / printstar ( ); /*調(diào)用printstar函數(shù)* /printstar ( ) printf(“*n”);print_message ( ) printf(“How do you do!”);運行結(jié)果* * * * * * * * * * * * How do you do !* * * * * * * * * * * *第2頁/共104頁幾點說明: 一個源程序文

2、件由一個或多個函數(shù)組成。 一個C程序由一個或多個源程序文件。 C程序的執(zhí)行從main函數(shù)開始,調(diào)用其他函數(shù)后流程回到main函數(shù),在main函數(shù)中結(jié)束整個函數(shù)的運行。 main函數(shù)是系統(tǒng)定義的。 所有函數(shù)是平行的,一個函數(shù)不屬于另一個函數(shù),函數(shù)不能嵌套定義,但是可以互相調(diào)用,但是main函數(shù)不能被調(diào)用。第3頁/共104頁函數(shù)分類用戶角度:庫函數(shù) 、 自定義函數(shù)函數(shù)形式:無參函數(shù) 、 有參函數(shù)、空函數(shù)第4頁/共104頁8.2 函數(shù)定義的一般形式 1無參函數(shù)的定義形式 類型表示符 函數(shù)名() 聲明部分 語句 第5頁/共104頁 2 有參函數(shù)定義的一般形式 類型標(biāo)識符 函數(shù)名(形式參數(shù)列表) 形式參

3、數(shù)說明 聲明部分 語句 3空函數(shù) 類型說明符 函數(shù)名() 第6頁/共104頁 形參的傳統(tǒng)聲明 例如:int max(x,y) int x,y; /*形式參數(shù)說明*/ int z; /*函數(shù)體內(nèi)部說明*/ z=xy? x:y; return(z); /*返回值*/ 第7頁/共104頁8.3 函數(shù)參數(shù)和函數(shù)的值 形式參數(shù)和實際參數(shù) 函數(shù)的返回值第8頁/共104頁8.3.1 形式參數(shù)和實際參數(shù)main( )int a,b,c; scanf(”%d,%d”,&a,&b);c=max(a,b);printf(”Max is%d”,c);max(int x,int y) /*定義有參函數(shù)m

4、ax*/int z;z=xy? x:y;return(z); 運行情況如下:7,8max is 8第9頁/共104頁 c=max(a,b) (main 函數(shù)) max(int x,int y) (max 函數(shù)) int z; z=xy? x:y; return(z); 第10頁/共104頁關(guān)于形參與實參的說明: (1)在定義函數(shù)中指定的形參,在未出現(xiàn)函數(shù)調(diào)用時,它們并不占內(nèi)存中的存儲單元。 (2)實參可以是常量,變量或表達(dá)式,但要求它們有確定的值。 (3)在被定義的函數(shù)中,必須指定形參的類型 (4)實參與形參的類型應(yīng)相同或賦值兼容。 (5)C語言規(guī)定,實參變量對形參變量的數(shù)據(jù)傳遞是“值傳遞”,

5、即單向傳遞,只由實參傳給形參,而不能由形參傳回給實參,這是和FORTRAN不同的。第11頁/共104頁8.3.2 函數(shù)的返回值 (1)函數(shù)返回值是通過函數(shù)中return語句獲得的。 (2)既然函數(shù)有返回值,應(yīng)當(dāng)在定義函數(shù)時指定函數(shù)值的類型。 (3)如果函數(shù)值的類型和return語句中表達(dá)式的值不一致,則以函數(shù)類型為準(zhǔn)。對數(shù)值型數(shù)據(jù),可以自動進(jìn)行類型轉(zhuǎn)換。即函數(shù)類型決定返回值的類型。第12頁/共104頁l例8.3lmain( )lfloat a,b;lInt c;l scanf(”%f,%f”,&a,&b);lc=max(a,b);lprintf(”Max is%d”,c);ll

6、max(float x, float y) /*定義有參函數(shù)max*/lfloat z;lz=xy? x:y;lreturn(z);l l運行情況如下:l1.5,2.5lmax is 2第13頁/共104頁(4)如果被調(diào)用函數(shù)中沒有return語句,并不帶回一個確定,用戶希望得到的函數(shù)數(shù)值,但實際上,函數(shù)并不是不帶回值,而只是不帶回有用的值,帶回的是一個不確定的值。(5)為了明確表示“不帶回值”,可以用“void”定義無類型。第14頁/共104頁8.4 函數(shù)的調(diào)用 1. 函數(shù)調(diào)用的一般形式 2. 函數(shù)調(diào)用的方式 3. 對被調(diào)用函數(shù)的聲明和函數(shù)原型第15頁/共104頁 1. 函數(shù)調(diào)用的一般形式m

7、ain( )int i2,p ; pf ( i,+i); 函數(shù)調(diào)用/ printf(”d”,p); int f (int a,int b) 函數(shù)定義/int c; if (ab) c1; else if (ab) c0; else c -l ; return ( c );請問運行結(jié)果-1 or 0?結(jié)果是:0(系統(tǒng)傳遞順序)第16頁/共104頁 函數(shù)調(diào)用的一般形式為: 函數(shù)名(實參表列); 實參與形參按順序?qū)?yīng),一一傳遞數(shù)據(jù). 實參求值的順序并不是確定的. Turbo C是按自右而左的順序求值。第17頁/共104頁 2. 函數(shù)調(diào)用的方式 按函數(shù)在程序中出現(xiàn)的位置來分,可以有以下三種函數(shù)調(diào)用方式

8、: (1)函數(shù)語句 把函數(shù)調(diào)用作為一個語句。 如:printstar( ); 這時不要求函數(shù)帶回值,只要求函數(shù)完成一定的操作。 第18頁/共104頁 (2)函數(shù)表達(dá)式 例如: c2* max(a,b); 這時要求函數(shù)帶回一個確定的值以參加表達(dá)式的運算。 (3)函數(shù)參數(shù) 函數(shù)調(diào)用作為一個函數(shù)的實參。 例如: printf(”d”,max(a,b);第19頁/共104頁 3. 對被調(diào)用函數(shù)的聲明和函數(shù)原型 被調(diào)用函數(shù)需要具備條件: (1)首先被調(diào)用的函數(shù)必須是已經(jīng)存在的函數(shù). (2)如果使用庫函數(shù),一般還應(yīng)該在本文件開頭用#include命令,來“包含”一個“頭文件”。第20頁/共104頁 (3)

9、如果使用用戶自己定義的函數(shù),一般還應(yīng)該在主調(diào)函數(shù)中對被調(diào)用的函數(shù)作聲明。main( ) float add(float x,float y); *對被調(diào)用函數(shù)的聲明* float a,b,c; scanf(”%f,%f”,&a,&b); c=add(a,b); printf(”sum is%f”,c); float add(float x,float y) *函數(shù)首部* float z; *函數(shù)體* z=x+y; return(z); 運行情況如下: 35,65 sum is l0000000第21頁/共104頁 函數(shù)聲明稱為函數(shù)原型(function prototype) 使

10、用函數(shù)原型是ANSI C的一個重要特點。 它的作用主要是利用它在程序的編譯階段對調(diào)用函數(shù)的合法性進(jìn)行全面檢查。第22頁/共104頁 函數(shù)原型的一般形式為: (1)函數(shù)類型 函數(shù)名(參數(shù)類型1,參數(shù)類型2) (2)函數(shù)類型 函數(shù)名(參數(shù)類型1,參數(shù)名1,參數(shù)類型2,參數(shù)名2)第23頁/共104頁 對所調(diào)用函數(shù)不作聲明的情況為: A函數(shù)類型為整型,可以在函數(shù)調(diào)用前不必作函數(shù)聲明。 例如: int max(int,int) ; 或 int max(int x,int y);第24頁/共104頁 B被調(diào)用函數(shù)的定義出現(xiàn)在主調(diào)函數(shù)之前,可以不必加以聲明。float add(float x,float y

11、)float z; z=x+y; return(z); main ( ) *不必對add函數(shù)作聲明* float a,b,c; scanf(”%f,%f”,&a,&b); c=add(a,b); prinif(”%f”,c);第25頁/共104頁 C已在所有函數(shù)定義之前,在函數(shù)的外部做過函數(shù)聲明,則在各個主調(diào)函數(shù)中不必對所調(diào)用的函數(shù)再作聲明。char letter(char,char); *以下3行在所有函數(shù)之前,且在函數(shù)外部*float f(float,float); int i(float,float); main() *不必聲明它所調(diào)用的函數(shù)* char letter(c

12、har c1,char c2) *定義letter函數(shù)* float f(float x,float y) *定義f函數(shù)* int i(float j,float k) *定義i函數(shù)* 第26頁/共104頁 例 按給定符號和長度輸出一個圖形條XXXXXXXXXXXX#$ 子函數(shù)接受兩個輸入:圖案和個數(shù),以個數(shù)作為循環(huán)次數(shù) for (i=1;i=num;i+) printf(“%c”,ch);第27頁/共104頁l#include “stdio.h”l# define DOLLAR $lmain()l int income;l char symbol;l income = 20; symbol

13、= #;l drawBar (12, X);l drawBar (3*5, symbol);l drawBar (Income, DOLLAR);ldrawbar(x,ch)int x;char ch; int i; for (i=1;i0) *f(x)與f(x1)同符號* y1=y ; x1=x; else x2=x; while(fabs(y)=0.0001); return(x);第35頁/共104頁 main ( ) *主函數(shù)* float x1,x2,f1,f2,x ; do printf(”input x1,x2:n”); scanf(”%f,%f”,&x1,&x2

14、); f1=f(x1); f2=f(x2); while(fl*f2=0); x=root(x1,x2); printf(”A root of equation is%8.4f”,x); 運行情況如下: input x1,x2: 2,6 A root of equation is 50000第36頁/共104頁8.6 函數(shù)的遞歸調(diào)用int f(int x) int y,z; z=f(y); return(2*z);第37頁/共104頁l在調(diào)用一個函數(shù)的過程中又出現(xiàn)直接或間接地調(diào)用該函數(shù)本身,稱為函數(shù)的遞歸調(diào)用。lC語言的特點之一就在于允許函數(shù)的遞歸調(diào)用。第38頁/共104頁 例87 有5個人坐

15、在一起,問第5個人多少歲?他說比第4個人大2歲。問第4個人歲數(shù),他說比第3個人大2歲。問第3個人,又說比第2個人大2歲。問第2個人,說比第1個人大2歲。最后問第1個人,他說是10歲。請問第5個人多大。第39頁/共104頁 age(5)age(4)十2 age(4)age(3)十2 age(3)age(2)十2 age(2)age(1)十2 age(1)10 可以用式子表述如下: age(n)10 (n1) age(n-1)+2 (n1)第40頁/共104頁l“回推”和“遞推”的過程第41頁/共104頁 age(int n) *求年齡的遞歸函數(shù)* int c; * c用作存放函數(shù)的返回值的變量*

16、 if(n=1)c=10; else c=age(n-1)+2; return c; main( ) printf(”%d”,age(5); 運行結(jié)果如下: 18第42頁/共104頁第43頁/共104頁 例88 用遞歸方法求 n!。 用遞歸方法,即5 !等于4 ! 5,而4 ! 3 ! 41 ! 1。 遞歸公式表示: n!1 (n=0,1)n*(n-1)! (n1)第44頁/共104頁float fac(int n) float f; if(n0) printf(“nai3次,其中i每次為不同的值),則認(rèn)為a數(shù)組大于b數(shù)組,并分別統(tǒng)計出兩個數(shù)組相應(yīng)元素大于、等于、小于的次數(shù)。第54頁/共104

17、頁 main( ) int large(int x,int y); * 函數(shù)聲明 * int a10,bl0,i,n=0,m=0,k=0; printf(“enter array a:n”); for(i=0;i10;i+) scanf(”%d”,&ai); printf(“n”); printf(“enter array b:n”); for(i=0;i10;i+) scanf(”%d”,&bi); printf(”n”); for(i=0; ik) printf(”array a is larger than array bn”); elseif(nk ) printf(”

18、array a is smaller than array bn”); else printf(”array a is equal to array b n”);第55頁/共104頁 large(int x,int y) int flag; if(xy) flag=1; else if(xy) flag=-1; else flag=0; return(flag); 運行情況如下: enter array a : 1 3 5 7 9 8 6 4 2 0 enter array b : 5 3 8 9 -1-3 5 6 0 4 aibi 4 times aIbi 1 times aibi 5 ti

19、mes array a is smaller than array b第56頁/共104頁 2數(shù)組名可作函數(shù)參數(shù) 數(shù)組名可以作函數(shù)參數(shù),此時實參與形參都應(yīng)用數(shù)組名.第57頁/共104頁 (1)用數(shù)組名作函數(shù)參數(shù),應(yīng)該在主調(diào)函數(shù)和被調(diào)用函數(shù)分別定義數(shù)組。 (2)實參數(shù)組與形參數(shù)組類型應(yīng)一致,如不一致,結(jié)果將出錯。 (3)在被調(diào)用函數(shù)中聲明的形參數(shù)組的大小不起任何作用的,只是將實參數(shù)組的首地址傳給形參數(shù)組。 (4)形參數(shù)組也可以不指定大小,在定義數(shù)組時在數(shù)組名后面跟一個空的方括弧。 (5) 用數(shù)組名作函數(shù)實參時,不是把數(shù)組的值傳遞給形參,而是把實參數(shù)組的起始地址傳遞給形參數(shù)組,這樣兩個數(shù)組就共占同

20、一段內(nèi)存單元。第58頁/共104頁 float average(float array ,int n) int i; f1oat aver,sum =array0; for(i=1;in;i+) sum =sum+arrayi; aver =sum/n; return(aver); main( ) float score_l5 =98.5,97,91.5,60,55); float score_210 =67.5,89.5,99,69.5,77,89.5,76.5,54,60,99.5); printf (“the average of class A is %6.2fn”,average(s

21、core_1,5); printf (“the average of class B is %6.2fn”,average(score_2,10); 運行結(jié)果如下: the average of class A is 8040 the average of class B is 7820第59頁/共104頁 例813 用選擇法對數(shù)組中10個整數(shù)按由小到大排序。所謂選擇法就是先將10數(shù)中最小的數(shù)與a0對換;再將a1到a,9中最小的數(shù)與a1對換。每比較一輪,出一個未經(jīng)排序的數(shù)中最小的一個。共比較9輪。a0 a1 a2 a3 a4 3 6 1 9 4 未排序時的情況 1 6 3 9 4 將5個數(shù)中最

22、小的數(shù)1與a0對換 1 3 6 9 4 將余下的4個數(shù)中最小的數(shù)3與a1對換 1 3 4 9 6 將余下的3個數(shù)中最小的數(shù)4與a2對換 1 3 4 6 9 將余下的2個數(shù)中最小的數(shù)6與a3對換第60頁/共104頁void sort(int array ,int n) int i,j,k,t; for(i=0; in-l ; i+) k=i ; for(j=i+1; jn; j+) if(arrayjarrayk) k =j; t=arrayk; arrayk=arrayi; arrayi=t; 第61頁/共104頁main( )int a10,i; printf(“enter the arra

23、yn”); for(i=0 ; i10 ; i+) scanf(“%d”, &ai); sort(a, 10); printf(“the sorted array:n”); for(i=0 ; i10; i+) printf(“%d”, ai);printf(“n”);第62頁/共104頁 3用多維數(shù)組名作函數(shù)參數(shù) 可以用多維數(shù)組名作為實參和形參,在被調(diào)用函數(shù)中對形參數(shù)組定義時可以指定每一維的大小,也可以省略第一維的大小說明。 如 int array310; 或 int array 10; 二者都合法而且等價第63頁/共104頁 不能把第二維以及其他高維的大小說明省略。 如 int a

24、rray 或 int array3 ; 但形參數(shù)組第一維的大小可以是任意的。例如,實參數(shù)組定義為 int array510; 而形參數(shù)組定義為 int array310;或int array810第64頁/共104頁 例814 有一個34的矩陣,求所有元素中的最大值。 算法:先使變量max的初值為矩陣中第一個元素的值,然后將矩陣中各個元素的值與max相比,每次比較后都把“大者”存放在max中,全部元素比較完后,max的值就是所有元素的最大值。第65頁/共104頁 max_value(int array 4) int i, j,max; max =array00; for(i=0;i3; i+)

25、 for(j=0;jmax) max=arrayij; return(max); main( ) int a34 =1,3,5,7,2,4,6,8,15,17,34,12; printf(“max value is%dn”, max_value(a); 運行結(jié)果如下: max value is 34第66頁/共104頁8.8 局部變量和全局變量 1 局部變量 2 全局變量第67頁/共104頁 局部變量 在一個函數(shù)內(nèi)部定義的變量是內(nèi)部變量,它只在本函數(shù)范圍內(nèi)有效,也就是說只有在本函數(shù)內(nèi)才能使用它們,在此函數(shù)以外是不能使用這些變量的。這稱為“局部變量”。第68頁/共104頁 (1)主函數(shù)也不能使用

26、其他函數(shù)中定義的變量。 (2)不同函數(shù)中可以使用相同名字的變量,它們代表不同的對象,互不干擾。 (3)形式參數(shù)也是局部變量。 (4)在一個函數(shù)內(nèi)部,可以在復(fù)合語句中定義變量,這些變量只在本復(fù)合語句中有效,這種復(fù)合語句也可稱為“分程序”或“程序塊”。第69頁/共104頁 全局變量 程序的編譯單位是源程序文件,一個源文件可以包含一個或若干個函數(shù)。在函數(shù)內(nèi)定義的變量是局部變量,而在函數(shù)之外定義的變量稱為外部變量,外部變量是全局變量(也稱全程變量)。全局變量可以為本文件中其他函數(shù)所共用。它的有效范圍為從定義變量的位置開始到本源文件結(jié)束。第70頁/共104頁 (1)設(shè)全局變量的作用是增加了函數(shù)間數(shù)據(jù)聯(lián)系

27、的渠道。 為了便于區(qū)別全局變量和局部變量,在C程序設(shè)計人員中有一個不成文的約定(但非規(guī)定),將全局變量名的第一個字母用大寫表示。 (2)建議不在必要時不要使用全局變量。 (3)如果在同一個源文件中,外部變量與局部變量同名,則在局部變量的作用范圍外部變量被“屏蔽”,即它不起作用。第71頁/共104頁例816 外部變量與局部變量同名。int a=3,b=5; * a、b為外部變量*max(int a,int b) * a、b為局部變量*int c; c=ab?a:b; return (c);main( ) int a=8; * a為局部變量*局部變量a的作用范圍 printf(“%d”, max(

28、a,b); 全局變量b的作用范圍運行結(jié)果為8第72頁/共104頁8.9 變量的儲存類別 1 動態(tài)存儲方式與靜態(tài)存儲方式 2 auto變量 3 用static聲明局部變量 4 register變量 5 用extern聲明外部變量 6 用static聲明外部變量 7 關(guān)于變量的聲明和定義 8 存儲類別小結(jié)第73頁/共104頁 1 動態(tài)存儲方式與靜態(tài)存儲方式 從變量值存在的時間(即生存期)角度來分 靜態(tài)存儲方式是指在程序運行期間分配固定的存儲空間的方式。 而動態(tài)存儲方式則是在程序運行期間根據(jù)需要進(jìn)行動態(tài)的分配存儲空間的方式。第74頁/共104頁 內(nèi)存中的供用戶使用的存儲空間分為三部分 1程序區(qū) 2靜

29、態(tài)存儲區(qū) 3動態(tài)存儲區(qū) 全局變量全部存放在靜態(tài)存儲區(qū)中 在動態(tài)存儲區(qū)中存放以下數(shù)據(jù):1函數(shù)形式參數(shù)。2自動變量。3函數(shù)調(diào)用時的現(xiàn)場保護(hù)和返回地址等。第75頁/共104頁 存儲類別 在C語言中每一個變量和函數(shù)有兩個屬性:數(shù)據(jù)類型和數(shù)據(jù)的存儲類別。 存儲類別指的是數(shù)據(jù)在內(nèi)存中存儲的方法。存儲方法分為兩大類:靜態(tài)存儲類和動態(tài)存儲類。具體包含四種:自動的(auto),靜態(tài)的(static),寄存器的(register),外部的(extern)。 根據(jù)變量的存儲類別,可以知道變量的作用域和生存期。第76頁/共104頁 2 auto變量 函數(shù)中不專門聲明為static存儲類別的形參和在函數(shù)中定義的變量為自

30、動變量。自動變量用關(guān)鍵字auto作存儲類別的聲明。 關(guān)鍵字“auto”可以省略,auto不寫則隱含確定為“自動存儲類別方式。程序中大多數(shù)變量屬于自動變量。第77頁/共104頁 3 用static聲明局部變量 希望函數(shù)中的局部變量的值在函數(shù)調(diào)用結(jié)束后不消失而保留原值時,可用關(guān)鍵字static進(jìn)行聲明。 (1)靜態(tài)局部變量屬于靜態(tài)存儲類別,在靜態(tài)存儲區(qū)內(nèi)分配存儲單元。在程序整個運行期間都不釋放。 (2)對靜態(tài)局部變量是在編譯時賦初值的,以后每次調(diào)用函數(shù)時不再重新賦初值而只是保函數(shù)調(diào)用結(jié)束時的值。 (3)如在定義局部變量時不賦初值的話,則對靜態(tài)局部變量來說,編譯時自動賦初值0(對數(shù)值型變量)或空字符

31、(對字符變量)。 (4)雖然靜態(tài)局部變量在函數(shù)調(diào)用結(jié)束后仍然存在,但其他函數(shù)是不能引用它的。第78頁/共104頁 例818 打印1到5的階乘值。 int fac(int n) static int f=1; f=f*n ; return(f); main( ) int i; for(i=1;i=5;i+) printf(“%d! =%dn”, i,fac(i); 運行結(jié)果為: 1 ! 1 2 ! 2 3 ! 6 4 ! 24 5 ! 120第79頁/共104頁 需要用局部靜態(tài)變量的情況 (1)需要保留函數(shù)上一次調(diào)用結(jié)束時的值。 (2)如果初始化后,變量只被引用而不改變其值,則這時用靜態(tài)局部變量

32、比較方便,以免每次調(diào)用時重新賦值。 如不必要,不要多用靜態(tài)局部變量。第80頁/共104頁 4 register變量 為提高執(zhí)行效率,C語言允許將局部變量的值放在CPU中的寄存器中,需要用時直接從寄存器取出參加運算,不必再到內(nèi)存中去存取。由于對寄存器的存取速度遠(yuǎn)高于對內(nèi)存的存取速度,因此這樣做可以提高執(zhí)行效率。這種變量叫做“寄存器變量”,用關(guān)鍵字register作聲明。第81頁/共104頁 (1)只有局部自動變量和形式參數(shù)可以作為寄存器變量,其他(如全局變量)不行。 (2)一個計算機系統(tǒng)中的寄存器數(shù)目是有限的,不能定義任意多個寄存器變量。 當(dāng)今的優(yōu)化編譯系統(tǒng)能夠識別使用頻繁的變量,從而自動地將這

33、些變量放在寄存器中,而不需要程序設(shè)計者指定。因此在實際上用register聲明變量是不必要的。 (3)局部靜態(tài)變量不能定義為寄存器變量。第82頁/共104頁 5 用extern聲明外部變量 有時用extern來聲明外部變量,以擴展外部變量的作用城。 A 在一個文件內(nèi)聲明外部變量 B 在多文件的程序中聲明外部變量第83頁/共104頁 A 在一個文件內(nèi)聲明外部變量 如果外部變量不在文件的開頭定義,其有效的作用范圍只限于定義處到文件終了。如果在定義點之前的函數(shù)想引用該外部變量,則應(yīng)該在引用之前用關(guān)鍵字extern對該變量作“外部變量聲明”。表示該變量是一個已經(jīng)定義的外部變量。有了此聲明,就可以從“聲

34、明”處起,合法地使用該外部變量。第84頁/共104頁 B 在多文件的程序中聲明外部變量 如果程序由多個源程序文件組成,那么在一個文件中想引用另一個文件中已定義的外部變量時,可在任一個文件中定義此外部變量,而在另一文件中用extern對該作“外部變量聲明”。 但是用這樣的全局變量應(yīng)十分慎重,因為在執(zhí)行一個文件中的函數(shù)時,可能會改變了該全局變量的值,它會影響到另一文件中的函數(shù)執(zhí)行結(jié)果。第85頁/共104頁 本程序的作用是給定b的值,輸入a和m,求a6和am的值。 文件file1.c中的內(nèi)容為: int A; *定義外部變量* main( ) int power(int); *對調(diào)用函數(shù)作聲明* i

35、nt b3,c,d,m; printf(“enter the number a and its power m:n”); scanf(”%d,% d”,&A,&m); cA * b ; printf(”d *ddn”,A,b,c); dpower(m); printf(“%d * * %d%d”,A,m,d); 文件file2.c中的內(nèi)容為: extern A; *聲明A為一個已定義的外部變量* power(int n) int i, y1; for(i1; in; i+) y *A; return(y);第86頁/共104頁 6 用static聲明外部變量 希望某些外部變量只

36、限于被本文件引用,而不能被其他文件引用??梢栽诙x外部變量時加一個static聲明。稱為靜態(tài)外部變量。 需要指出對外部變量加static聲明,并不意味著這時才是靜態(tài)存儲,而不加static的是動態(tài)存儲。兩種形式的外部變量都是靜態(tài)存儲方式,只是作用范圍不同而已,都是在編譯時分配內(nèi)存的。第87頁/共104頁 7 關(guān)于變量的聲明和定義 一般為了敘述方便,把建立存儲空間的聲明稱定義,而把不需要建立存儲空間的聲明稱為聲明。 需要建立存儲空間的(如:int a;) 稱為“定義性聲明”(defining declaration),或稱定義(definition)。 不需要建立存儲空間的(如:extern a

37、;)后者稱為“引用性聲明”(referenceing declaration)。第88頁/共104頁 外部變量的定義只能有一次,它的位置在所有函數(shù)之外。 而同一文件中的外部變量的聲明可以有多次,它的位置可以在函數(shù)之內(nèi)也可以在函數(shù)之外。 注意,用auto、register、static聲明變量時,是在定義變量的基礎(chǔ)上加上這些關(guān)鍵字,而不能單獨使用。第89頁/共104頁 8 存儲類別小結(jié) 對一個數(shù)據(jù)的定義,需要指定兩種屬性:數(shù)據(jù)類型和存儲類別,分別使用兩個關(guān)鍵字。如: static int a; (靜態(tài)內(nèi)部整型變量或靜態(tài)外部整型變量) auto char c; (自動變量,在函數(shù)內(nèi)定義) regi

38、sterint d; (寄存器變量,在函數(shù)內(nèi)定義) 此外,可以用extern聲明變量為己定義的外部變量,如: extern b; (聲明b是一個已被定義的外部變量)第90頁/共104頁 (1)從作用域角度分,有局部變量和全局變量。局部變量自動變量,即動態(tài)局部變量(離開函數(shù),值就消失)靜態(tài)局部變量(離開函數(shù),值仍保留)寄存器變量(離開函數(shù),值就消失)(形式參數(shù)可以定義為自動變量或寄存器變量)靜態(tài)外部變量(只限本文件引用)外部變量(即非靜態(tài)的外部變量,允許其他文件引用)全局變量第91頁/共104頁 (2)從變量存在的時間來區(qū)分,有動態(tài)存儲和靜態(tài)存儲兩種類型。靜態(tài)存儲是程序整個運行時間都存在,而動態(tài)

39、存儲則是在調(diào)用函數(shù)時臨時分配單元。 動態(tài)存儲靜態(tài)存儲自動變量(本函數(shù)內(nèi)有效)寄存器變量(本函數(shù)內(nèi)有效)形式參數(shù)靜態(tài)局部變量(函數(shù)內(nèi)有效)靜態(tài)外部變量(本文件內(nèi)有效)外部變量(其它文件可引用)第92頁/共104頁 (3)從變量值存放的位置來區(qū)分內(nèi)存中靜態(tài)存儲區(qū)靜態(tài)外部變量(函數(shù)外部靜態(tài)變量)靜態(tài)局部變量外部變量(可為其它文件引用)內(nèi)存中動態(tài)存儲區(qū):自動變量和形式參數(shù)CPU中的寄存器:寄存器變量第93頁/共104頁 (4)關(guān)于作用域和生存期的概念 如果一個變量在某個文件或函數(shù)范圍內(nèi)是有效的,則稱該文件或函數(shù)為該變量的作用域,在此作用域內(nèi)可以引用該變量,所以又稱變量在此作用域內(nèi)“可見”,這種性質(zhì)又稱為變量的“可見性”。 如果一個變量值在某一時刻是存在的,則認(rèn)為這一時刻屬于該變量的“生存期”,或稱該變量在此時刻“存在”。第94頁/共104頁第95頁/共104頁 (5)static對局部變量和全局變量的作用不同。 對局部變量來說,它使變量由動態(tài)存儲方式改變?yōu)殪o態(tài)存儲方式。 而對全局變量來說,它使變量局部化(局部于本文件),但仍為靜態(tài)存儲方式。 從作用域角度看,凡有static聲明的,其作用域都是局限的。第96頁/共104頁8.10 內(nèi)部函數(shù)和外

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論