計(jì)算機(jī)二級第8章函數(shù)_第1頁
計(jì)算機(jī)二級第8章函數(shù)_第2頁
計(jì)算機(jī)二級第8章函數(shù)_第3頁
計(jì)算機(jī)二級第8章函數(shù)_第4頁
計(jì)算機(jī)二級第8章函數(shù)_第5頁
已閱讀5頁,還剩64頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、 教學(xué)內(nèi)容: 8.1 概述 8.2 函數(shù)定義 8.3 函數(shù)返回值 8.4 函數(shù)的調(diào)用 8.5 變量的作用域與存儲類別 8.6 函數(shù)的存儲類別 第 8 章 函 數(shù) 教學(xué)要求: 1.掌握函數(shù)的定義和調(diào)用方式,以及形參與實(shí)參之間數(shù)據(jù)傳遞的規(guī)則。 2.掌握局部變量與全局變量、靜態(tài)存儲與動態(tài)存儲變量的使用方法。 3. 掌握遞歸函數(shù)的定義與調(diào)用。 4.了解內(nèi)部函數(shù)和外部函數(shù)的概念。 第 8 章 函 數(shù) 8.1 概 述1.函數(shù)分類(1) 庫函數(shù), C系統(tǒng)已提供的函數(shù)。例如: printf(); scanf(); sin(); putchar(); getchar();(2)主函數(shù):main() (3)用戶自

2、定義函數(shù),函數(shù)名不能與主函數(shù)名或庫函數(shù)名相同,函數(shù)體語句由用戶自己編寫。(4) 空函數(shù), 函數(shù)體無語句。函數(shù)的另外分類方法: (1)有參函數(shù) (2)無參函數(shù): (3)有返回值函數(shù) (4)無返回值函數(shù) 2.庫函數(shù)分類(功能角度) (1) 數(shù)學(xué)函數(shù),包括三角函數(shù)、指數(shù)等。 (2) 字符串、字符處理函數(shù)。 (3) 轉(zhuǎn)換函數(shù),用于字符或字符串的轉(zhuǎn)換;在字符量和各類數(shù)字量(整型,實(shí)型等)之間進(jìn)行轉(zhuǎn)換;在大、小寫之間進(jìn)行轉(zhuǎn)換。 (4) 目錄路徑函數(shù),用于文件目錄和路徑操作。 (5) 診斷函數(shù),用于內(nèi)部錯誤檢測。 (6) 字符屏幕和圖形功能函數(shù) (7) 輸入輸出函數(shù),用于完成輸入輸出功能。 (8) 接口函數(shù)

3、,用于與DOS,BIOS和硬件的接口 3.函數(shù)的作用 (1) C編譯系統(tǒng)可以對一個程序中的多個函數(shù),分成若干個源程序分別進(jìn)行編譯,編譯效率高 。所以,一個C程序又可以由若干個源文件組成。 (2)所有函數(shù)之間是互相獨(dú)立的,即函數(shù)的定義不能嵌套定義。 (3) 一個C程序從運(yùn)行主函數(shù)開始執(zhí)行,到主函數(shù)運(yùn)行終止,整個程序執(zhí)行結(jié)束。 (4) 函數(shù)是構(gòu)成C程序的基本單元,C語言是通過函數(shù)來實(shí)現(xiàn)模塊化程序設(shè)計(jì) 。8.2 函 數(shù) 定 義1函數(shù)組成函數(shù)(含主函數(shù))都是由函數(shù)說明和函數(shù)體兩部分。(1)無參函數(shù)的一般形式: 函數(shù)類型 函數(shù)名( void ) 說明語句部分; 可執(zhí)行語句部分; 注意:在舊標(biāo)準(zhǔn)中,函數(shù)可

4、以缺省參數(shù)表。但在新標(biāo)準(zhǔn)中,除主函數(shù)main()外,函數(shù)不可缺省參數(shù)表,如果不需要參數(shù),則用“void”表示 。 函數(shù)體函數(shù)說明( 2 ) 有參函數(shù)的一般形式函數(shù)類型 函數(shù)名( 數(shù)據(jù)類型 參數(shù)1 ,數(shù)據(jù)類型 參數(shù)2 ) 說明語句部分; 可執(zhí)行語句部分; 形式參數(shù):將函數(shù)定義中的參數(shù)表稱為形式參數(shù)表,簡稱形參表。與調(diào)用函數(shù)提供的實(shí)際參數(shù)區(qū)別。 實(shí)際參數(shù):調(diào)用有參函數(shù)時,調(diào)用函數(shù)必須賦予這些參數(shù)實(shí)際的值,調(diào)用函數(shù)中的參數(shù)稱為實(shí)際參數(shù)。( 3 ) 空函數(shù)其形式為: 函數(shù)類型 函數(shù)名(void) “空函數(shù)”既無參數(shù)、函數(shù)體為空的函數(shù),什么操作也不做。其作用是在此處留一函數(shù)的位置,以便將來擴(kuò)充功能之用。

5、函數(shù)名也在將來換取實(shí)際的函數(shù)名。2、函數(shù)定義說明: 在語言中,所有函數(shù)(包括主函數(shù)main())都是平行的、獨(dú)立的。 在一個包含多個函數(shù)的程序中,一個函數(shù)的定義,可以放在程序中的任意位置,即可以放在主函數(shù)main()之前或放在主函數(shù)main()之后。 在一個函數(shù)的函數(shù)體內(nèi),不能再定義另一個函數(shù),即函數(shù)不能嵌套定義。 函數(shù)之間允許互相調(diào)用,以可以嵌套調(diào)用。 例 8.1 在程序的主函數(shù)中,執(zhí)行了3次調(diào)用無參函數(shù)s()語句 。 # include void main() void s( ) ; /*函數(shù)調(diào)用說明*/ int i=0, a=10; while ( iy ? x : y; return(

6、z); 帶參數(shù)的用戶自定義函數(shù) int max( int x, int y ) int z; z=xy ? x : y; return (z); 在老版本C語言中,參數(shù)類型說明允許放在函數(shù)說明部分的第2行單獨(dú)指定。 例:int max(x,y)int x, y; int z; z=xy ? x : y; return (z);在新版本中寫成一行: int max( int x, int y )在老版本中寫成二行: int max(x, y ) int x, y; 語言的函數(shù)從有無返回值這個角度考慮,可把函數(shù)分為有返回值函數(shù)和無返回值函數(shù)兩種。有參函數(shù)的返回值,是通過函數(shù)中的 return語句來

7、獲得的。(1)返回語句的格式: return ( 表達(dá)式 );(2)return 語句的功能:返回調(diào)用函數(shù),并將“表達(dá)式”的值帶給調(diào)用函數(shù)。 (3) return語句返回值的類型應(yīng)與該函數(shù)的類型一致。否則以函數(shù)類型為準(zhǔn)。 8.3 函數(shù)返回值 (4) return 語句后面可以是變量,也可以是表達(dá)式。 如: return (x y ? x : y); (5) return 語句的后面可以有括號,也可以沒有。 如 : return z ; 或 return(z); (6) 函數(shù)的返回值是通過 return 語句獲得的。當(dāng)不需返回函數(shù)值時,可省去return語句。 調(diào)用函數(shù)中無 return 語句,

8、并不是不返回一個值,而是一個不確定的值。為了明確表示不返回值,可以用“void”定義成“無(空)類型”。 若函數(shù)中沒有return語句,則該函數(shù)被調(diào)用后也會帶回不確定的值。如在執(zhí)行以下的函數(shù)體語句: int a, b, c ; a=printstar( ); b=print_message( ); c=printstar( ); printf(“%d,%d,%dn”,a,b,c); 輸出的a, b, c的值將是各個被處理的字符串的長度。 為了明確表示不需要函數(shù)返回值,可以用“void”定義函數(shù)為“無類型”。 此時,不得使用a=printstar( )之類的語句。3個被調(diào)函數(shù)中均沒有return

9、語句 例8.3 主函數(shù)分別調(diào)用空類型函數(shù)fu1和返回整型值的fu2函數(shù)。程序如下:# include main()void fu1( int a, int b ); int fu2( int a, int b ) ; int a, b ; printf(input two numbers:n); scanf(“%d%d”,&a,&b); fu1(a,b); printf(“(a+b)* (a+b) = %dn”, fu2(a,b); void fu1(int x, int y ) int z1 ; z1=x*x+y*y; printf( x*x+y*y=%dn ,z1); int fu2(in

10、t x, int y ) int z2 ; z2=(x+y)* (x+y); return ( z2 ); 其中fu1() ,fu2() 兩個函數(shù)為用戶自己定義函數(shù),需要用戶指定函數(shù)名及函數(shù)體內(nèi)語句。無返回值 函數(shù)返回值函數(shù)8.4 函 數(shù) 的 調(diào) 用 C程序通過對函數(shù)的調(diào)用來執(zhí)行函數(shù)體的。 1、函數(shù)調(diào)用方式(1)表達(dá)式語句調(diào)用函數(shù)。 被調(diào)函數(shù)作為表達(dá)式的一項(xiàng),出現(xiàn)在表達(dá)式中,以函數(shù)返回值參與表達(dá)式的運(yùn)算。 這種方式要求函數(shù)是有返回值的。 例如: a = b+fun(x,y);(2)函數(shù)語句 被調(diào)函數(shù)可以只進(jìn)行某些操作而不返回函數(shù)值,這時的函數(shù)調(diào)用可作為一條獨(dú)立的語句。 例如: funa( );

11、(3)函數(shù)實(shí)參 被調(diào)函數(shù)作為另一個函數(shù)調(diào)用的實(shí)際參數(shù)出現(xiàn)。即把該函數(shù)的返回值作為實(shí)參進(jìn)行傳送,因此要求該函數(shù)必須是有返回值的。例如: printf(“%dn”,max(a,b);2. 調(diào)用函數(shù)說明 (1)調(diào)用函數(shù)時,函數(shù)名稱必須與具有該功能的自定義函數(shù)名稱完全一致。(2)實(shí)參在類型上按順序與形參,必須一一對應(yīng)和匹配。如果類型不匹配,C編譯程序?qū)促x值兼容的規(guī)則進(jìn)行轉(zhuǎn)換。如果實(shí)參和形參的類型不賦值兼容,通常并不給出出錯信息,且程序仍然繼續(xù)執(zhí)行,只是得不到正確的結(jié)果。(3)如果實(shí)參表中包括多個參數(shù),對實(shí)參的求值順序隨系統(tǒng)而異。有的系統(tǒng)按自左向右順序求實(shí)參的值,有的系統(tǒng)則相反。Turbo C和MS

12、C是按自右向左的順序進(jìn)行的 。 例8.4 函數(shù)調(diào)用方式示例程序。# include # include main()void fu1( int a, int b ); int fu2( int a, int b ) ; int a, b, x1; printf(input two numbers:n); scanf(“%d%d”,&a,&b); fu1(a,b); /*調(diào)用求兩數(shù)平方和函數(shù) */ printf(“(a+b)* (a+b) = %dn”, fu2(a,b); x1 sqrt(a+b); printf(“x1 %dn”,x1); 函數(shù)調(diào)用說明表達(dá)式語句函數(shù)調(diào)用 作為 函數(shù)實(shí)參 被調(diào)

13、用函數(shù)語句調(diào)用函數(shù)語句調(diào)用函數(shù)語句調(diào)用3函數(shù)類型在定義函數(shù)時,對函數(shù)類型的說明,應(yīng)與return 語句中返回值表達(dá)式的類型一致。如果不一致,則以函數(shù)類型為準(zhǔn)。如果缺省函數(shù)類型,則系統(tǒng)一律按整型處理。良好的程序設(shè)計(jì)習(xí)慣:為了使程序具有良好的可讀性并減少出錯,凡不要求返回值的函數(shù)都應(yīng)定義為空類型;即使函數(shù)類型為整型,也不使用系統(tǒng)的缺省處理。例8.5int f ( int a , int b ) ; int c ; if ( a b ) c = 1; else if ( a = = b ) c = 0 ; else c = 1 ; return( c ) ;main( ) int i =2 , p

14、; p = f ( i , + + i ); printf ( “%d”, p ) ;輸出結(jié)果: 0 注意:這里是按自右至左求值的,相當(dāng)于fun(3,3)。 3 b 3 a函數(shù)類型為int 4. 對被調(diào)用函數(shù)的說明 ANSI C對被調(diào)用函數(shù)進(jìn)行說明,其一般格式如下:函數(shù)類型 函數(shù)名( 形參表 ); 以下2種情況下,可以省去對被調(diào)用函數(shù)的說明: (1)當(dāng)被調(diào)用函數(shù)的函數(shù)定義出現(xiàn)在調(diào)用函數(shù)之前時。因?yàn)樵谡{(diào)用之前,編譯系統(tǒng)已經(jīng)知道了被調(diào)用函數(shù)的函數(shù)類型、參數(shù)個數(shù)、類型和順序。 (2)如果在所有函數(shù)定義之前,在函數(shù)外部(例如文件開始處)預(yù)先對各個函數(shù)進(jìn)行了說明。例8.6main( ) int f (

15、int a , int b ) ; int i =2 , p ; p = f ( i , + + i ); printf ( “%d”, p ) ;int f ( int a , int b ) int c ; if ( a b ) c = 1; else if ( a = = b ) c = 0 ; else c = 1 ; return( c ) ;輸出結(jié)果: 0被調(diào)用函數(shù)的函數(shù)定義出現(xiàn)在調(diào)用函數(shù)之后,對被調(diào)用函數(shù)進(jìn)行說明5. 函數(shù)的形參與實(shí)參形式參數(shù):將函數(shù)定義中的參數(shù)表稱為形式參數(shù)表,簡稱形參表。與調(diào)用函數(shù)提供的實(shí)際參數(shù)區(qū)別。 實(shí)際參數(shù):調(diào)用有參函數(shù)時,調(diào)用函數(shù)必須賦予這些參數(shù)實(shí)際的值

16、,調(diào)用函數(shù)中的參數(shù)稱為實(shí)際參數(shù)。當(dāng)函數(shù)調(diào)用時,調(diào)用函數(shù)把實(shí)參的值傳送給被調(diào)用函數(shù)的形參,從而實(shí)現(xiàn)調(diào)用函數(shù)向被調(diào)用函數(shù)的數(shù)據(jù)傳送。 形參出現(xiàn)在函數(shù)定義中,只能在該函數(shù)體內(nèi)使用。 說明:(1)函數(shù)的實(shí)參可以使用:常量、變量、表達(dá)式、函數(shù)。無論函數(shù)的實(shí)參是何種類型的量,在進(jìn)行函數(shù)調(diào)用時,它們都必須具有確定的值,以便把這些值傳送給形參。(2)形參變量只有在被調(diào)用時,才分配內(nèi)存單元,調(diào)用結(jié)束時,即刻釋放所分配的內(nèi)存單元。因此,形參只有在該函數(shù)內(nèi)有效。調(diào)用結(jié)束,返回調(diào)用函數(shù)后,則不能再使用該形參變量。(3)實(shí)參對形參的數(shù)據(jù)傳送是單向的,即只能把實(shí)參的值傳送給形參,不能把形參的值反向地傳送給實(shí)參。(4)實(shí)參

17、和形參占用不同的內(nèi)存單元,即使同名也互不影響。例8.7 實(shí)參對形參的數(shù)據(jù)傳遞。程序如下: void main() void s(int n); int x=12; s( x ); printf(n_s=%dn,x); /*輸出調(diào)用后實(shí)參的值*/ void s( int n ) int i; printf(n_x=%dn,n); /*輸出改變前形參的值*/ for(i=n-8; i=1; i-) n=n+i; /*改變形參的值*/ printf(n_x=%dn,n) /*輸出改變后形參的值*/ 調(diào)用函數(shù) x 的值傳給形參n12x12n 例8.8 程序中3次調(diào)用func() 。 # include

18、 int func( int x,int y ) int z; z=x+y; return z ; void main() int i=3, j=2, k=1; do k+=func( i, j ); printf(“%dn”,k); i+; j+; while (i=5); 運(yùn)行結(jié)果: 6 13 22實(shí)參值傳送給形參: 第1次調(diào)用:3 x 2 y 第2次調(diào)用:4 x 3 y 第3次調(diào)用: 5 x 4 y形參int x,int y 實(shí)參為整型變量 i, j例8.9 求兩個數(shù)的平方和 #include float mul( int a,int b ) return a * ab * b ; ma

19、in() int x,y,z; scanf(“%d , %d”,&x,&y); z=mul(x,y); printf(z=%dn,z); x=x+5; y=y -3; z=mul(x,y); printf(mul(%d,%d)=%dn,x,y,mul(x,y); 第1次mul(2,6)輸入2 , 6 X6 y第2次mul(7,3)第3次mul(7,3)形 參 運(yùn)行結(jié)果: 40 mul(7,3)=58 6.函數(shù)的嵌套調(diào)用 (1)函數(shù)的嵌套調(diào)用是指,在執(zhí)行被調(diào)用函數(shù)時,被調(diào)用函數(shù)又調(diào)用了其它函數(shù)。(2)函數(shù)的嵌套調(diào)用執(zhí)行過程 :例8.10 嵌套調(diào)用程序。# include main() print

20、f (“ Im in main.n”); fun1( ); printf (“ Now Im in main.n”); void fun1( ) printf (“ Now Im in fun1.n”) fun2( ); void fun2( ) printf (“ Now Im in fun2.n”); 主函數(shù)體內(nèi)調(diào)用fun1( )fun1( )函數(shù)體內(nèi)調(diào)用fun2( ) 例8.11 計(jì)算 s=1k + 2k + 3k + + N k 設(shè) k=3 n=6 即求:13 + 23 + 33 + + 6 3的和。 /*求 1 到 n 的 k 次方之累加和*/ long f2 ( int n, in

21、t k ) int i; long sum=0; for( i=1; i=n; i+ ) sum += f1( i, k ); return sum; N為6累加6次n=6 k=3 /*計(jì)算 n 的 k 次方值的函數(shù)*/ long f1( int n, int k ) long power=1; int i; for( i=1; i= k; i+ ) power *= n; return power; main() int k=3, n=6; printf(Sum of %d powers of integers ,k); printf( from 1 to %d = , N); printf

22、(%dn,f2(n,k) ); k=3累乘3次 6次調(diào)用 f1()函數(shù) n的值為: 1 2 3 4 5 67.函數(shù)的遞歸調(diào)用(1)函數(shù)的遞歸調(diào)用是指,一個函數(shù)在它的函數(shù)體內(nèi),直接或間接地調(diào)用它自身。語言允許函數(shù)的遞歸調(diào)用。在遞歸調(diào)用中,調(diào)用函數(shù)又是被調(diào)用函數(shù),執(zhí)行遞歸函數(shù)將反復(fù)調(diào)用其自身。每調(diào)用一次就進(jìn)入新的一層。(2)遞歸調(diào)用終止為了防止遞歸調(diào)用無終止地進(jìn)行,必須在函數(shù)內(nèi)有終止遞歸調(diào)用的手段。常用的辦法是加條件判斷,滿足某種條件后就不再作遞歸調(diào)用,然后逐層返回。#include fact (int); void main() int m; printf(“Enter a number: ”

23、); scanf(“%d”, &m); printf(“%d! = %dn”, m, fact(m); fact(int n) int result; if(n=1) return (1); result = fact(n-1)*n;/* 遞歸調(diào)用 */ return (result); 例8.12用遞歸調(diào)用編寫計(jì)算階乘n!的函數(shù)fact()。 求n! 階乘計(jì)算公式:n!=n(n-1)! 程序如左邊: 調(diào)用和返回過程(n=4):調(diào)用: main() fact(4) fact(3) fact(2) fact(1) 執(zhí)行: fact(4) 4*fact(3) 3*fact(2) 2*fact(1)

24、 1 返回: 24 4*6=24 3*2=6 2*1=2 1 程序運(yùn)行情況如下: Enter a number:5 5! = 120 8.5 變量的作用域與存儲類別 1. 變量的作用域 語言中所有的變量都有自己的作用域。變量的作用域是指變量在程序中的有效范圍。 變量說明的位置不同,其作用域也不同。語言中的變量按照作用域,分為內(nèi)部變量和外部變量。 2. 內(nèi)部變量(1)在函數(shù)內(nèi)部定義的變量稱為內(nèi)部變量,內(nèi)部變量也稱“局部變量”。 內(nèi)部變量只有在包含變量說明的函數(shù)內(nèi)部才能使用,在此函數(shù)之外就不能使用這些變量。(2)局部變量僅由其被定義的模塊內(nèi)部的語句所訪問(變量值可見)。換言之,局部變量在自己的代碼

25、模塊之外是不可知的。模塊以左花括號開始,以右花括號結(jié)束。 局部變量僅存在于被定義的當(dāng)前執(zhí)行代碼塊中,即局部變量在進(jìn)入模塊時生成,在退出模塊時消亡。定義局部變量的最常見的代碼塊是函數(shù)。 例8.13 int f1(int a) int b,c ; int f2(int x) int y,z ; main() int m,n ; a,b,c作用域:僅限于函數(shù)f1()中x,y,z作用域:僅限于函數(shù)f2()中m,n作用域:僅限于函數(shù)main()中 a, b, c, x, y, z , m, n 都是內(nèi)部變量 (3)主函數(shù) main()中定義的內(nèi)部變量,是局部變量,也只能在主函數(shù)中使用,其它函數(shù)不能使用。

26、同樣,主函數(shù)中也不能使用其它函數(shù)中定義的內(nèi)部變量。因?yàn)橹骱瘮?shù)也是一個函數(shù),與其它函數(shù)是平行關(guān)系。 (4)形參變量也是內(nèi)部變量,屬于被調(diào)用函數(shù);實(shí)參變量,則是調(diào)用函數(shù)的內(nèi)部變量。 (5)允許在不同的函數(shù)中使用相同的變量名,它們代表不同的對象,分配不同的單元,互不干擾,也不會發(fā)生混淆。 (6)在復(fù)合語句中也可定義變量,其作用域只在復(fù)合語句范圍內(nèi)。 輸出結(jié)果: 10, 4, 8 10, 2, 5例8.14#include “stdio.h”main( ) int a=1, b=2, c=3; a+; c+=b; int b=4, c; c=2b; a+=c; printf(“%d,%d,%dn”,

27、a, b, c); printf(“%d,%d,%dn”, a, b, c);復(fù)合語句中定義的變量b、c,其作用域只在復(fù)合語句范圍內(nèi) 主函數(shù)中與復(fù)合語句中分別定義的同名變量b、c, 它們代表不同的對象,分配不同的單元,互不干擾 3. 全局變量 (1)在函數(shù)外部定義的變量稱為外部變量,外部變量又稱全局變量。 外部變量不屬于任何一個函數(shù),其作用域是:從外部變量的定義位置開始,到本文件結(jié)束為止。 外部變量可被作用域內(nèi)的所有函數(shù)直接引用。 (2)外部變量的定義,在所有的函數(shù)之外,且只能定義一次。 外部變量說明的一般形式為: extern 數(shù)據(jù)類型 外部變量1 ,外部變量2 ; (3)如果定義點(diǎn)之前的函

28、數(shù)需要引用這些外部變量時,需要在函數(shù)內(nèi)對被引用的外部變量進(jìn)行說明,可以出現(xiàn)多次。 (4)與局部變量不同,全局變量貫穿整個程序,并且可被任何一個模塊使用,它們在整個程序執(zhí)行期間保持有效。 (5)在同一源文件中,允許外部變量和內(nèi)部變量同名。在內(nèi)部變量的作用域內(nèi),外部變量將被屏蔽而不起作用。 (6)避免使用不必要的全局變量3種原因: 外部變量可加強(qiáng)函數(shù)模塊之間的數(shù)據(jù)聯(lián)系,但又使這些函數(shù)依賴這些外部變量,因而使得這些函數(shù)的獨(dú)立性降低。 全局變量在整個程序執(zhí)行期間均占有存儲空間。 程序中大量使用全局變量,不可知的和不需要的副作用將可能導(dǎo)致程序錯誤。 例8. 15全局變量的使用舉例。 int count;

29、 /* count是全局變量*/main () count =100; func1( ); func1( ) int temp; Temp = count ; func2() Printr(“count is %d”, count); /* 打印100*/ func2() int count; for (count=1; count10; count+)Putchar(*); /* 打印出*/ 例8.16 外部變量的定義與說明。 int vs( int xl, int xw ) extern int xh; /*外部變量xh的說明*/ int v; v=xl*xw*xh; /*使用外部變量xh

30、的值*/ return v; main() extern int xw , xh; /*外部變量的說明*/ int xl=5; /*內(nèi)部變量的定義*/ printf(xl=%d,xw=%d,xh=%dn ,xl,xw,xh); printf(“ v=%d“,vs(xl,xw); int xl=3, xw=4, xh=5; /*外部變量定義*/ 4.變量存儲類別 變量具有兩個屬性:類型、存儲類別。類型規(guī)定了變量和函數(shù)的取值范圍和運(yùn)算范圍;則決定了變量在內(nèi)存中的存儲區(qū)域和生成期,即存在時間。 (1) 變量的存儲類型 變量的存儲類型說明有以下四種: 自動變量(auto) 寄存器變量(register

31、) 外部變量(extern) 靜態(tài)變量(static)。 自動變量和寄存器變量屬于動態(tài)存儲方式,外部變量和靜態(tài)內(nèi)部變量屬于靜態(tài)存儲方式。數(shù)據(jù)區(qū) (2) 變量的存儲 靜態(tài)存儲變量存放在靜態(tài)存儲區(qū)。在編譯時分配空間,直到整個程序執(zhí)行完畢才釋放。 動態(tài)存儲變量存放在動態(tài)存儲區(qū)。在函數(shù)調(diào)用時分配臨時的空間,離開函數(shù),其空間便被系統(tǒng)收回,其值隨之消失。 C系統(tǒng)中, 內(nèi)存用戶區(qū)空間可劃分為三個區(qū),如下圖所示:靜態(tài)存儲區(qū)動態(tài)存儲區(qū) 程 序 區(qū) 5. 動態(tài)存儲變量 (1)自動變量,只在定義函數(shù)內(nèi)有效;函數(shù)被調(diào)用時分配存儲空間,調(diào)用結(jié)束就釋放。 定義形式為:auto 數(shù)據(jù)類型 變量表; 動態(tài)存儲變量可以是函數(shù)的

32、形式參數(shù)、局部變量、函數(shù)調(diào)用時的現(xiàn)場保護(hù)和返回地址。 自動變量定義時不初始化,則其值是不確定的。如果初始化,則賦初值操作是在調(diào)用時進(jìn)行的,且每次調(diào)用都要重新賦一次初值。 在復(fù)合語句中定義的自動變量,只在該復(fù)合語句中有效。 在不同函數(shù)或復(fù)合語句中允許使用同名的變量而不會混淆。(2)寄存器變量 語言允許將局部變量的值存放到寄存器中,這種變量就稱為寄存器變量。定義格式如下: register 數(shù)據(jù)類型 變量表; 只有局部變量才能定義成寄存器變量,即全局變量不行。 對寄存器變量的實(shí)際處理,隨系統(tǒng)而異。例如,微機(jī)上的MSC和TC 將寄存器變量實(shí)際當(dāng)作自動變量處理。 允許使用的寄存器數(shù)目是有限的,不能定義

33、任意多個寄存器變量。 6. 靜態(tài)存儲變量 靜態(tài)存儲變量無論是做全程量或是局部變量,其定義和初始化在程序編譯時進(jìn)行,在編譯時分配存儲空間的變量稱為靜態(tài)存儲變量。 (1)內(nèi)部靜態(tài)變量(又稱為靜態(tài)局部變量) 在函數(shù)內(nèi)定義,在調(diào)用函數(shù)結(jié)束時,靜態(tài)存儲變量不消失并且保留原值,但其它函數(shù)不能引用它們。 定義形式: static 數(shù)據(jù)類型 內(nèi)部變量表;靜態(tài)局部變量定義時不初始化,則系統(tǒng)自動賦以“0”(整型和實(shí)型)或0(字符型);且每次調(diào)用它們所在的函數(shù)時,不再重新賦初值,只保留上次調(diào)用結(jié)束時的值。例8.17靜態(tài)內(nèi)部變量應(yīng)用 int fac( int n ) static int f=1; 運(yùn)行結(jié)果: 1!=

34、1 f=f*n; 2!=2 return f; 3!=6 4!=24 main( ) 5!=120 int i; for ( i=1; i=5; i+) printf(“%d!=%dn”,i, fac(i); 例8.18 自動變量與靜態(tài)局部變量的存儲特性。 void austatic(void) int vto=0; /*自動變量每次調(diào)用都重新初始化*/ static int vtic=0; /*靜態(tài)局部變量只初始化1次*/ printf(“vto=%d, vtic=%dn”, vto, vtic); +vto; +vtic; main() int i; for(i=0; i5; i+) au

35、static( ); 運(yùn)行結(jié)果: vto=0,vtic=0 vto=0,vtic=1 vto=0,vtic=2 vto=0,vtic=3 vto=0,vtic=4(2)外部靜態(tài)變量在函數(shù)外定義,外部靜態(tài)變量只允許被本源文件中的函數(shù)引用。靜態(tài)外部變量定義形式: static 數(shù)據(jù)類型 外部變量表; (3)非靜態(tài)外部變量允許被其它源文件中函數(shù)引用,定義時缺省 static 關(guān)鍵字的外部變量。 非靜態(tài)外部變量定義形式: 據(jù)類型 外部變量表; 允許被其它源文件中函數(shù)引用, 非靜態(tài)外部變量引用 其它源文件中的函數(shù),引用非靜態(tài)外部變量時,需要在引用函數(shù)所在的源文件中進(jìn)行說明: extern 數(shù)據(jù)類型 外部

36、變量表; 在函數(shù)內(nèi)的extern變量說明,表示引用本源文件中的外部變量! 在函數(shù)外(通常在文件開頭)的extern變量說明,表示引用其它文件中的外部變量 7.靜態(tài)局部變量和靜態(tài)外部變量兩者區(qū)別: (1)定義的位置不同。 靜態(tài)局部變量在函數(shù)內(nèi)定義,靜態(tài)外部變量在函數(shù)外定義。(2)作用域不同。靜態(tài)局部變量屬于內(nèi)部變量,其作用域僅限于定義它的函數(shù)內(nèi);雖然生存期為整個源程序,但其它函數(shù)是不能使用它的。靜態(tài)外部變量其作用域?yàn)槎x它的源文件內(nèi);生存期為整個源程序,但其它源文件中的函數(shù)也是不能使用它的。 (3)初始化處理不同。靜態(tài)局部變量,僅在第1次調(diào)用它所在的函數(shù)時被初始化,當(dāng)再次調(diào)用定義它的函數(shù)時,不再

37、初始化,而是保留上1次調(diào)用結(jié)束時的值。靜態(tài)外部變量是在函數(shù)外定義的,不存在靜態(tài)內(nèi)部變量的“重復(fù)”初始化問題,其當(dāng)前值由最近1次給它賦值的操作決定。 注意:(1)把局部變量改變?yōu)殪o態(tài)內(nèi)部變量后,改變了它的存儲方式,即改變了它的生存期。(2)把外部變量改變?yōu)殪o態(tài)外部變量后,改變了它的作用域,限制了它的使用范圍。因此,關(guān)鍵字“static”在不同的地方所起的作用是不同的。外部變量的說明:(動態(tài))內(nèi)部變量的說明:靜態(tài)外部變量的說明:static 類型名 變量名; extern 類型名 變量名; auto 類型名 變量名;靜態(tài)內(nèi)部變量的說明:static 類型名 變量名;變量存儲類的說明(定義)方式:可省略不寫可省略不寫在函數(shù)外在函數(shù)內(nèi)變量的存儲類別靜態(tài)存儲類動態(tài)存儲類外 部 變 量靜態(tài)外部變量靜態(tài)內(nèi)部變量自動變量寄存器變量形式參數(shù) 靜 態(tài) 變 量離開函數(shù)其值消失允許其它文件引用在引用它文件中用extern作說明離開函數(shù)其值保留只限本文件引用但應(yīng)先定義后引用,否則須作聲明:extern 類型符 變量名;全局量局部量在函數(shù)外定義其值永久保留只限本函數(shù)或本復(fù)合語句中使用。在函數(shù)或復(fù)合語句內(nèi)定義。在cpu中分配臨時空間。動態(tài)內(nèi)部變量8.6 函數(shù)的存儲類別 語言允許一個大程序分成若干個程序單元,編譯成若干個源程序文件。 1. 主文件與外部文件 語言把

溫馨提示

  • 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

提交評論