版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、第7章 C程序的模塊化設(shè)計 本章要點(diǎn)C程序的模塊化結(jié)構(gòu) 內(nèi)部變量、外部變量、靜態(tài)(static)變量 變量的存儲屬性 動態(tài)存儲分配和釋放編譯預(yù)處理7.1 C程序的模塊化結(jié)構(gòu) 7.3 變量和函數(shù)的存儲屬性 7.4 動態(tài)存儲分配和釋放第7章 C程序的模塊化設(shè)計7.2 內(nèi)部變量、外部變量和作用域、生存期 7.7 本章小結(jié) 7.5 編譯預(yù)處理 7.6 綜合應(yīng)用舉例7.1 C程序的模塊化結(jié)構(gòu)模塊化程序設(shè)計方法的思想: 將一個較大的程序按功能分割成一些模塊,每個模塊都是功能單一、結(jié)構(gòu)清晰、接口簡單、容易理解的小任務(wù)。對每一個處于底層的小任務(wù)編寫相應(yīng)的實(shí)現(xiàn)函數(shù),然后通過函數(shù)調(diào)用的方法將多個這樣的函數(shù)按功能組
2、合成一個較高層的調(diào)用函數(shù),多個這樣的調(diào)用函數(shù)又可成為被調(diào)函數(shù),并按功能組織成更高層次的調(diào)用函數(shù)。 7.1 C程序的模塊化結(jié)構(gòu)模塊化程序設(shè)計的基本方法:自頂向下(或自底向上)和逐步求精。 C語言的開發(fā)工具提供了程序工程開發(fā)的能力 。 工程由多個源程序文件組成。 每個源程序文件可以單獨(dú)編譯;然后再連接成一個大的可執(zhí)行文件 。 每個源程序文件可以包含一個或多個函數(shù)。 一個工程只能有一個main主函數(shù)。 7.1 C程序的模塊化結(jié)構(gòu)7.1.1 概述7.1.2 多源文件程序的結(jié)構(gòu)7.1.3 分割編譯7.1 C程序的模塊化結(jié)構(gòu)7.1.1 概述函數(shù)是C程序的基本組成單位。C編程就是在main函數(shù)中給一些函數(shù)安
3、排一個執(zhí)行順序,而在這些函數(shù)中,又安排了另一些函數(shù)的執(zhí)行順序。 7.1 C程序的模塊化結(jié)構(gòu)7.1.1 概述main() f1( );f2( );f1( ) g1( ) f2( ) h1( );h2( );k1()g1( )k1()h1( ) h2( ) k1( ) 圖7.1由若干個函數(shù)組成的一個程序1.1 算法、C語言和程序設(shè)計7.1.1 概述如何組織這些函數(shù)?問題: 1.1 算法、C語言和程序設(shè)計7.1.2 多源文件程序的結(jié)構(gòu)當(dāng)一個程序由許多函數(shù)構(gòu)成時,如果所有的函數(shù)都放在一個.c程序文件中,勢必會造成文件體積龐大,查找函數(shù)困難,閱讀理解困難,函數(shù)取名困難,安排函數(shù)的順序也困難。程序員編程時
4、,往往采用模塊化程序設(shè)計方法,將一個大的程序分解為功能單一的小模塊。1.1 算法、C語言和程序設(shè)計7.1.2 多源文件程序的結(jié)構(gòu)將圖7.1的所有函數(shù)組織在三個程序文件file1.c、file2.c和file3.c中。/* file1.c */extern void f1();extern void f2();void main() f1(); f2(); /* file2.c */void g1( ); void k1( );void f1( ) g1( );void g1( ) k1( );void k1( ) /* file3.c */void h1( ); void h2( ); ext
5、ern void k1( );void f2( ) h1( ); h2( );k1( );void h1( ) void h2( ) 7.1 C程序的模塊化結(jié)構(gòu)7.1.3 分割編譯編譯是以源文件為單位進(jìn)行的。在編譯該程序時,可以以源文件為單位分別進(jìn)行編譯,相應(yīng)產(chǎn)生目標(biāo)文件,然后再用連接程序?qū)⒎謩e編譯產(chǎn)生的多個目標(biāo)文件連接成一個可執(zhí)行文件,這樣的過程稱為分割編譯。7.1 C程序的模塊化結(jié)構(gòu)7.1.3 分割編譯編寫多源文件程序的步驟基本:編譯:必須對程序中的每個源程序文件單獨(dú)進(jìn)行編譯,編譯通過后生成相應(yīng)的文件名同源程序文件名,擴(kuò)展名為.obj的目標(biāo)程序文件。由于有多個源程序文件,因此有多個目標(biāo)程序
6、文件。連接:連接器把上一步生成的多個目標(biāo)程序文件和系統(tǒng)的庫函數(shù)代碼結(jié)合在一起生成擴(kuò)展名為.exe的可執(zhí)行程序文件。運(yùn)行:運(yùn)行生成后的可執(zhí)行文件。7.2 內(nèi)部變量、外部變量和作用域、生存期7.2.1 內(nèi)部變量、外部變量7.2.2 靜態(tài)(static)變量7.2.3 作用域及生存期7.2 內(nèi)部變量、外部變量和作用域、生存期7.2.1 內(nèi)部變量、外部變量1內(nèi)部變量:也稱局部變量,即在函數(shù)內(nèi)部定義的變量。以下變量都是內(nèi)部變量:在函數(shù)內(nèi)部定義的變量,其作用范圍只在該函數(shù)內(nèi)部。函數(shù)定義時的形參,其作用范圍只在該函數(shù)內(nèi)部。在復(fù)合語句中定義的變量,其作用范圍只在該復(fù)合語句內(nèi)。7.2 內(nèi)部變量、外部變量和作用域
7、、生存期7.2.1 內(nèi)部變量、外部變量內(nèi)部變量的特點(diǎn):塊作用域:所有內(nèi)部變量的作用域都是局部的,稱為程序塊作用域。自動生存期:局部變量具有自動存儲期限。當(dāng)調(diào)用函數(shù)時,“自動”分配局部變量的存儲單元,當(dāng)函數(shù)返回時釋放變量所在存儲空間 。注意:當(dāng)再次調(diào)用函數(shù)時,無法保證變量始終保留原來的值。 7.2 內(nèi)部變量、外部變量和作用域、生存期7.2.1 內(nèi)部變量、外部變量討論下面程序的內(nèi)部變量及其特點(diǎn):void main( ) int a, b; int x10,y10; if(ab) int t; t=a;a=b;b=t; Fun (x);void Fun (int x ) int a, b; 7.2
8、內(nèi)部變量、外部變量和作用域、生存期7.2.1 內(nèi)部變量、外部變量2外部變量:也稱全局變量,在任何函數(shù)之外定義的變量。其特點(diǎn)如下:全局生存期:一直占據(jù)所分配的存儲空間直至整個程序(工程)運(yùn)行結(jié)束。文件作用域:從變量定義點(diǎn)開始到整個源程序結(jié)束處,跟在外部變量聲明后的所有函數(shù)都可以訪問它。還可以通過extern存儲類型說明,把作用域擴(kuò)大到該源程序文件外部變量聲明之前的函數(shù)或者該工程的其它源程序文件中。7.2 內(nèi)部變量、外部變量和作用域、生存期7.2.1 內(nèi)部變量、外部變量分析下列程序不同位置上的變量n及其特點(diǎn):int n =5; void fun(void);void main() printf(“
9、1.main:n = %d n”, n); fun(); printf(“2.main:n = %d n”, n); void fun(void) n=10; printf(“3.fun:n = %d n”, n); 7.2 內(nèi)部變量、外部變量和作用域、生存期7.2.1 內(nèi)部變量、外部變量外部變量的作用:可以在不同的函數(shù)中傳遞數(shù)據(jù)。如例7.3 可以在不同的源程序文件中傳遞數(shù)據(jù),擴(kuò)大其作用范圍。如例7.4 7.2 內(nèi)部變量、外部變量和作用域、生存期7.2.1 內(nèi)部變量、外部變量外部變量可以在不同的函數(shù)中傳遞數(shù)據(jù):例7.3 輸入nm的矩陣,將其轉(zhuǎn)置后輸出。 下面給出實(shí)現(xiàn)的所有函數(shù)的說明:input
10、():實(shí)現(xiàn)矩陣數(shù)據(jù)的輸入。transpose():實(shí)現(xiàn)矩陣的轉(zhuǎn)置。print():實(shí)現(xiàn)矩陣的輸出。 由于以上這些函數(shù)都用到矩陣數(shù)據(jù),而函數(shù)不能返回數(shù)組,因此,可以將矩陣說明為外部變量。7.2 內(nèi)部變量、外部變量和作用域、生存期7.2.1 內(nèi)部變量、外部變量外部變量可以可以在不同的源程序文件中傳遞數(shù)據(jù),擴(kuò)大其作用范圍。如例7.4 。 當(dāng)一個程序分成幾個源文件來實(shí)現(xiàn)時,可以在不同源文件中傳遞全局變量,但必須有一處是定義外部變量的,而其它源程序文件必須對該外部變量進(jìn)行聲明,稱為外部變量的聲明。 外部變量的聲明格式:extern 數(shù)據(jù)類型 變量名;注意:全局變量只能定義一次,可多次用extern聲明以
11、擴(kuò)大作用域。7.2 內(nèi)部變量、外部變量和作用域、生存期7.2.1 內(nèi)部變量、外部變量外部變量與內(nèi)部變量可以同名時,內(nèi)部變量的優(yōu)先級高于外部變量。例7.5 分析下列程序的運(yùn)行結(jié)果。#include int n =5; int main() int n = 50; printf(“main:n = %d n”, n); fun();void fun(void) printf(“fun:n = %d n”, n); 7.2 內(nèi)部變量、外部變量和作用域、生存期7.2.1 內(nèi)部變量、外部變量3外部變量的利與弊 在多個函數(shù)共享一個變量或者少數(shù)幾個函數(shù)共享大量變量時,外部變量很有用。然而,外部變量破壞了函數(shù)
12、的獨(dú)立性。獨(dú)立性是重用代碼的起碼條件,只有完全不存在外部變量的函數(shù)才有獨(dú)立性,因此,盡量少用外部變量,可以通過形式參數(shù)在函數(shù)之間傳遞數(shù)據(jù)的方法消除外部變量。例7.6 消去例7.3的外部變量,改成形式參數(shù)傳遞來 實(shí)現(xiàn)。7.2 內(nèi)部變量、外部變量和作用域、生存期7.2.2 靜態(tài)(static)變量 在模塊化程序設(shè)計中,為了發(fā)揮程序的模塊作用,有必要引入一種模塊內(nèi)的全局變量,它區(qū)別于前面介紹的局部變量和全局變量。 這種變量具有全局壽命和局部可見性的特點(diǎn);且默認(rèn)初始化的值為0 。 7.2 內(nèi)部變量、外部變量和作用域、生存期7.2.2 靜態(tài)(static)變量靜態(tài)變量的定義格式如下: static 數(shù)據(jù)
13、類型 變量名表;例如,static int x,y;注意靜態(tài)全局變量和靜態(tài)局部變量之分。 7.2 內(nèi)部變量、外部變量和作用域、生存期7.2.2 靜態(tài)(static)變量靜態(tài)全局變量:在所有函數(shù)之外定義的靜態(tài)變量。特點(diǎn):只在定義的文件范圍內(nèi)可見,在其他程序文件中不可見。 例7.7 分析下列程序,由兩個源程序文件組成:/* test.c */#include extern void f1(); extern void f2();void main() f1();f2();f1();f2() ;/* test1.c */#include static int i; void f1(void) pri
14、ntf(“f1:i=%dn”,+i);void f2(void) printf(“f2:i=%dn”,+i);7.2 內(nèi)部變量、外部變量和作用域、生存期7.2.2 靜態(tài)(static)變量2靜態(tài)局部變量:在函數(shù)內(nèi)部定義的靜態(tài)變量。特點(diǎn):它只在定義它的函數(shù)內(nèi)部可見 ;在整個程序運(yùn)行期間一直占據(jù)其所在的存儲空間。 7.2 內(nèi)部變量、外部變量和作用域、生存期7.2.2 靜態(tài)(static)變量例7.8 分析下列程序,注意全局變量、靜態(tài)局部變量和局部變量的區(qū)別。 #include void f1(); int n=1; void main() int a=0,b=-10; printf(“main:a
15、=%d,b=%d,n=%dn”,a,b,n); f1(); printf(“main:a=%d,b=%d,n=%dn”,a,b,n); f1();void f1() static int a=2; int b=5; a+=2,b+=5; n+=12; printf(“f1:a=%d,b=%d,n=%dn”,a,b,n);運(yùn)行結(jié)果如下:main:a=0,b=-10,n=1f1: a=4,b=10,n=13main:a=0,b=-10,n=13f1: a=6,b=10,n=257.2 內(nèi)部變量、外部變量和作用域、生存期7.2.3 作用域及生存期作用域:通常把變量的有效使用范圍稱為作用域生存期:變量
16、的存在時間稱為生存期(存儲期)。 7.2 內(nèi)部變量、外部變量和作用域、生存期7.2.3 作用域及生存期1.作用域:作用域規(guī)則主要是針對程序文件來說的,即作用域是一個變量在程序文件中的有效區(qū)域。 C語言的作用域有2種 :塊作用域 :塊中定義的變量:其作用域起于定義它的位置,止于塊的結(jié)束,常見于復(fù)合語句中定義的變量;函數(shù)內(nèi)部定義的變量:其作用域從定義處開始一直到該函數(shù)結(jié)束;函數(shù)的形參:其所在的整個函數(shù)內(nèi)都有效。文件作用域 :從定義處開始到文件末尾。例如全局變量和全局靜態(tài)變量 。7.2 內(nèi)部變量、外部變量和作用域、生存期7.2.3 作用域及生存期1.作用域:作用域規(guī)則主要是針對程序文件來說的,即作用
17、域是一個變量在程序文件中的有效區(qū)域。例1,分析下列程序變量的作用域:void Fun (int x ) int a, b; void main( ) int a, b; int x10,y10; if(ab) int t; t=a;a=b;b=t; Fun (x);7.2 內(nèi)部變量、外部變量和作用域、生存期例2,分析下列程序變量的作用域: #include void f1(); int n=1; void main() int a=0,b=-10; printf(“main:a=%d,b=%d,n=%dn”,a,b,n); f1(); printf(“main:a=%d,b=%d,n=%dn”
18、,a,b,n); f1();void f1() static int a=2; int b=5; a+=2,b+=5; n+=12; printf(“f1:a=%d,b=%d,n=%dn”,a,b,n);7.2.3 作用域及生存期7.2 內(nèi)部變量、外部變量和作用域、生存期7.2.3 作用域及生存期2生存期:生存期是指一個實(shí)體產(chǎn)生后,存活時間的度量。對于變量,生存期決定了為變量預(yù)留和釋放內(nèi)存空間的時間。生存期的實(shí)質(zhì)表現(xiàn)為內(nèi)存空間的分配和收回。 一般而言,操作系統(tǒng)將程序裝入內(nèi)存后,將形成一個隨時可以運(yùn)行的進(jìn)程空間,該進(jìn)程空間分為四個區(qū)域,如下圖所示。 代碼區(qū)全局?jǐn)?shù)據(jù)區(qū)棧區(qū)堆區(qū)變量存在的區(qū)域7.2
19、內(nèi)部變量、外部變量和作用域、生存期7.2.3 作用域及生存期變量存在的區(qū)域:全局?jǐn)?shù)據(jù)區(qū):存放全局變量、靜態(tài)變量(包括靜態(tài)全局變量和靜態(tài)局部變量)。棧區(qū):存放函數(shù)數(shù)據(jù)區(qū),即局部變量。它動態(tài)地反映了程序運(yùn)行時的函數(shù)狀態(tài)。堆區(qū):存放動態(tài)變量,供程序員需要時申請和釋放,將在7.5節(jié)中介紹動態(tài)存儲分配和回收。變量在不同的內(nèi)存區(qū)域,將決定了其有不同的生存期。 7.2 內(nèi)部變量、外部變量和作用域、生存期7.2.3 作用域及生存期三種生存期:(1)全局生存期:分配在全局?jǐn)?shù)據(jù)區(qū)。在整個程序運(yùn)行期間始終占用同一內(nèi)存單元,直至整個程序執(zhí)行完畢。默認(rèn)初始化為0。(2)自動生存期:分配在棧區(qū)。這種變量在所屬塊被執(zhí)行時獲
20、得內(nèi)存單元,并在塊終止時釋放內(nèi)存單元具有“用之則建,用完則撤”的動態(tài)特點(diǎn)。若未初始化,則初值不定。(3)動態(tài)生存期:分配在堆區(qū)。這種空間的分配必須通過調(diào)用malloc函數(shù)或calloc函數(shù)獲得,不需要時可以調(diào)用free函數(shù)釋放內(nèi)存單元。7.2 內(nèi)部變量、外部變量和作用域、生存期例 分析下列程序變量的生存期: #include void f1(); int n=1; void main() int a=0,b=-10; printf(“main:a=%d,b=%d,n=%dn”,a,b,n); f1(); printf(“main:a=%d,b=%d,n=%dn”,a,b,n); f1();vo
21、id f1() static int a=2; int b=5; a+=2,b+=5; n+=12; printf(“f1:a=%d,b=%d,n=%dn”,a,b,n);7.2.3 作用域及生存期7.3 變量和函數(shù)的存儲屬性7.3.1 變量的存儲類型7.3.2 函數(shù)的存儲屬性7.3 變量和函數(shù)的存儲屬性7.3.1 變量的存儲類型變量的存儲類別有4種:auto:自動型static:靜態(tài)型register:寄存器型extern:外部型不同的存儲類別有不同的作用域和生存期。7.3 變量和函數(shù)的存儲屬性7.3.1 變量的存儲類型完整的變量定義格式如下:存儲類別 數(shù)據(jù)類型 變量名表;7.3 變量和函數(shù)
22、的存儲屬性7.3.1 變量的存儲類型1atuo型auto 數(shù)據(jù)類型 變量名表;例如,auto int x,y;auto char ch;特點(diǎn):存儲在棧區(qū)內(nèi),具有局部作用域、自動的生存期。是C語言默認(rèn)的存儲類型。 7.3 變量和函數(shù)的存儲屬性7.3.1 變量的存儲類型2register型register 數(shù)據(jù)類型 變量名表;例如,register int x,y;特點(diǎn):不占存儲空間,而是存儲到CPU的寄存器中。該存儲類別只對內(nèi)部變量有效,具有自動生存期、局部作用域。 不能定義多個這種類型的變量。7.3 變量和函數(shù)的存儲屬性7.3.1 變量的存儲類型3extern型extern 數(shù)據(jù)類型 變量名表
23、;特點(diǎn):這種變量由其它文件定義,定義的文件只是引用。 #include int a;int main(void) bb.c #include extern int a;int fun1(void)cc.c #include int fun2(void) extern int a;aa.c7.3 變量和函數(shù)的存儲屬性7.3.1 變量的存儲類型4static型static 數(shù)據(jù)類型 變量名表;例如,static int x,y;特點(diǎn):static型的變量存儲在全局?jǐn)?shù)據(jù)區(qū),因此具有全局壽命,且默認(rèn)初值為0。定義的位置不同,有不同的作用域 :在函數(shù)內(nèi)部定義的變量,具有塊作用域在函數(shù)外部定義的變量,具有
24、文件作用域7.2 內(nèi)部變量、外部變量和作用域、生存期分析下列程序的運(yùn)行結(jié)果: #include void f1(); int n=1; void main() int a=0,b=-10; printf(“main:a=%d,b=%d,n=%dn”,a,b,n); f1(); printf(“main:a=%d,b=%d,n=%dn”,a,b,n); f1();void f1() static int a=2; int b=5; a+=2,b+=5; n+=12; printf(“f1:a=%d,b=%d,n=%dn”,a,b,n);7.3.1 變量的存儲類型7.3 變量和函數(shù)的存儲屬性7.3
25、.2 函數(shù)的存儲屬性由于函數(shù)本質(zhì)上是外部的,定義函數(shù)的目的就是供其他函數(shù)調(diào)用,所以函數(shù)的存儲類別只有static和extern兩類。 7.3 變量和函數(shù)的存儲屬性7.3.2 函數(shù)的存儲屬性1內(nèi)部函數(shù)如果一個函數(shù)只能被本文件中其他函數(shù)調(diào)用,不能被工程的其它文件中的函數(shù)調(diào)用,可以把該函數(shù)定義為static型的內(nèi)部函數(shù)。 其定義格式如下:static 數(shù)據(jù)類型 函數(shù)名(形參列表)7.3 變量和函數(shù)的存儲屬性7.3.2 函數(shù)的存儲屬性2外部函數(shù)函數(shù)一般具有外部特點(diǎn)。如果在定義函數(shù)時前面沒有加上static限制,則在同一個工程中的不同源文件中都可以調(diào)用該函數(shù)。 其定義格式如下:數(shù)據(jù)類型 函數(shù)名(形參列表
26、)說明語句部分執(zhí)行語句部分 外部函數(shù)可以被同一工程中的其它文件調(diào)用,但必須在其它文件中進(jìn)行聲明,聲明格式如下:extern 數(shù)據(jù)類型 函數(shù)名(形參列表);7.4 動態(tài)存儲分配和釋放7.4.1 申請動態(tài)內(nèi)存7.4.2 動態(tài)內(nèi)存的釋放和重新分配7.4.3 void指針類型7.4 動態(tài)存儲分配和釋放 包括動態(tài)存儲分配:malloc函數(shù)和calloc函數(shù);動態(tài)存儲釋放及重新分配:free函數(shù)和realloc。在使用這些函數(shù)時,應(yīng)當(dāng)用“#include ”編譯預(yù)處理命令,把stdlib.h頭文件包含到程序文件中。7.4 動態(tài)存儲分配和釋放7.4.1 申請動態(tài)內(nèi)存 C語言允許建立內(nèi)存動態(tài)分配區(qū)域:需要時隨
27、時開辟,不需要時隨時釋放。 數(shù)據(jù)是臨時存放在一個特別自由的存儲區(qū),稱為堆區(qū)。 申請動態(tài)內(nèi)存的函數(shù)有malloc函數(shù)和calloc函數(shù)。7.4 動態(tài)存儲分配和釋放7.4.1 申請動態(tài)內(nèi)存1malloc函數(shù)函數(shù)原型為: void *malloc( unsigned int size);說明:該函數(shù)的功能是申請分配指定size個字節(jié)的存儲區(qū)。若申請成功,返回一個指向該存儲區(qū)的首地址;若沒有足夠的內(nèi)存空間分配,函數(shù)返回空(NULL)。7.4 動態(tài)存儲分配和釋放7.4.1 申請動態(tài)內(nèi)存例如,int *pi;/* 申請內(nèi)存空間,強(qiáng)制數(shù)據(jù)類型轉(zhuǎn)換*/pi=(int*)malloc(sizeof(int);
28、/* 如果申請成功,將123存儲于剛分配的存儲空間中 */if (pi!=NULL) *pi=123; 注意,由malloc所分配的存儲單元無確定的初值。7.4 動態(tài)存儲分配和釋放7.4.1 申請動態(tài)內(nèi)存2calloc函數(shù)函數(shù)原型為: void *calloc(unsigned n,unsigned size);說明:該函數(shù)可以給n個同一類型的數(shù)據(jù)項(xiàng)分配連續(xù)的存儲空間由calloc所分配的存儲單元,系統(tǒng)自動置初值0 例如:char *pc;pc=(char*)calloc(80, sizeof(char); /* pc指向具有80個連續(xù)char型的存儲區(qū)域的首地址 */7.4 動態(tài)存儲分配和釋
29、放7.4.2 動態(tài)內(nèi)存的釋放和重新分配用malloc和calloc函數(shù)在堆中分配的存儲空間,隨時可以調(diào)用free函數(shù)釋放,也可以通過realloc函數(shù)對動態(tài)分配的內(nèi)存區(qū)調(diào)整大小。7.4 動態(tài)存儲分配和釋放1free函數(shù)函數(shù)原型為: void free(void *p);說明:函數(shù)執(zhí)行后,p指向的存儲空間交還給系統(tǒng),指針變量p就沒有確切的指向了。7.4.2 動態(tài)內(nèi)存的釋放和重新分配7.4 動態(tài)存儲分配和釋放2realloc函數(shù)函數(shù)原型為: void *realloc(void *p,unsigned int size);說明:該函數(shù)的功能是將p所指向的已動態(tài)分配存儲區(qū)的大小改變?yōu)閟ize,siz
30、e可比原來分配的空間大或小。 7.4.2 動態(tài)內(nèi)存的釋放和重新分配7.4 動態(tài)存儲分配和釋放7.4.3 void指針類型void * 指針變量名;C99允許使用基類型為void的指針類型,其定義格式如下:說明:這種類型的指針不指向任何具體的數(shù)據(jù)。 在將它的值賦給另一指針變量時要進(jìn)行強(qiáng)制類型轉(zhuǎn)換,使之適合于被賦值變量的類型。 7.4 動態(tài)存儲分配和釋放7.4.3 void指針類型例7.9 建立動態(tài)數(shù)組。輸入5個學(xué)生的成績,調(diào)用一個函數(shù)檢查其中有無低于60分的成績,輸出這些不合格的成績。#include #include void main( ) void check(int *); int *p
31、1,i; void *p2; p2=malloc(5*sizeof(int); p1=(int *)p2; printf(輸入5個學(xué)生的成績:); for(i=0;i5;i+) scanf(%d,p1+i); check(p1); free(p2);void check(int *p)int i; printf(不合格的成績有:); for(i=0;i5;i+) if(pi(y)?(x):(y) .main() int a,b,c,d,t; . t=MAX(a+b,c+d); 宏展開:t=(a+b)(c+d)?(a+b):(c+d);int max(int x,int y) return(xy
32、?x:y);main() int a,b,c,d,t; . t=max(a+b,c+d); 例 用宏定義和函數(shù)實(shí)現(xiàn)同樣的功能7.5 編譯預(yù)處理7.5.1 宏定義帶參的宏與函數(shù)區(qū)別帶參宏函數(shù)處理過程不分配內(nèi)存簡單的字符置換分配內(nèi)存先求實(shí)參值,再代入形參處理時間編譯時程序運(yùn)行時參數(shù)類型無類型問題定義實(shí)參,形參類型程序長度變長不變運(yùn)行速度不占運(yùn)行時間調(diào)用和返回占時間7.5 編譯預(yù)處理7.5.1 宏定義3宏撤銷一般形式:#undef 宏名7.5 編譯預(yù)處理7.5.1 宏定義例,#define PI3.1415926#undef PI7.5 編譯預(yù)處理一般形式: #include “文件名” 或 #include 7.5.2 文件包含#include “file2.c”file1.cfile2.cfile1.cBABA說明:其作用是把
溫馨提示
- 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 收費(fèi)系統(tǒng)施工方案
- 搬遷安全管控方案
- 防水修復(fù)方案
- 病蟲害防治方案
- 插花藝術(shù)作品課程設(shè)計
- 插畫詩歌鑒賞課程設(shè)計
- 課程設(shè)計工廠起名
- 插槽液壓課程設(shè)計
- 插床導(dǎo)桿機(jī)構(gòu)課程設(shè)計
- 提升泵站污泥清理施工方案
- 1-2《光的傳播》(教學(xué)設(shè)計)蘇教版五年級科學(xué)上冊
- 2024-2030年中國新型電力系統(tǒng)行業(yè)發(fā)展展望及投資前景預(yù)測研究報告
- 2024自動導(dǎo)引車AGV技術(shù)規(guī)范
- 鹽池縣再生水廠、德勝墩水資源綜合利用特許經(jīng)營項(xiàng)目實(shí)施方案
- 廣東某辦公樓改造裝飾工程施工組織設(shè)計方案
- 制動能量回收系統(tǒng)故障診斷與排除說課課件
- 《20世紀(jì)的科學(xué)偉人愛因斯坦》參考課件2
- 八年級道德與法治上冊 第一單元 走進(jìn)社會生活 單元復(fù)習(xí)課件
- 中職心理健康課程設(shè)計
- 設(shè)計師會議管理制度
- 人教版英語九年級Unit 13《Were trying to save the earth》全單元教學(xué)設(shè)計
評論
0/150
提交評論