c語言程序設(shè)計與項目實踐第10章_第1頁
c語言程序設(shè)計與項目實踐第10章_第2頁
c語言程序設(shè)計與項目實踐第10章_第3頁
c語言程序設(shè)計與項目實踐第10章_第4頁
c語言程序設(shè)計與項目實踐第10章_第5頁
已閱讀5頁,還剩31頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、第10章 結(jié)構(gòu)體與共用體 本章的學(xué)習(xí)重點結(jié)構(gòu)體的定義結(jié)構(gòu)體變量的使用結(jié)構(gòu)體指針的定義和使用結(jié)構(gòu)體的內(nèi)存結(jié)構(gòu)結(jié)構(gòu)體指針作函數(shù)參數(shù)的使用共用體的定義共用體的內(nèi)存結(jié)構(gòu) 10.1 結(jié)構(gòu)體的定義 結(jié)構(gòu)體(struct)是由一系列相同或不同數(shù)據(jù)類型構(gòu)成的數(shù)據(jù)結(jié)構(gòu),也簡稱為結(jié)構(gòu)。C語言中,可以按照程序設(shè)計需求定義結(jié)構(gòu)體類型,將多個相關(guān)的變量封裝起來,成為一個有機的整體,這樣的結(jié)構(gòu)就是結(jié)構(gòu)體。例如,要存儲一個班級的信息,包括班號、男生人數(shù)、女生人數(shù)和班主任姓名等,可以將這些信息封裝成下面的格式:班號班主任姓名男生人數(shù)女生人數(shù)C語言規(guī)定了使用結(jié)構(gòu)體封裝其他數(shù)據(jù)類型的方式,并且可以對這些封裝命名。結(jié)構(gòu)體使用str

2、uct來定義其類型,例如,上述班級信息使用結(jié)構(gòu)體定義為:struct ClassInfoint ClassNumber;/成員1,定義班號char ClassAdministratorName30;/成員2,定義班主任姓名int MaleNumber;/成員3,定義男生人數(shù)int FamaleNumber;/成員4,定義女生人數(shù);10.1 結(jié)構(gòu)體的定義 C語言中,結(jié)構(gòu)體定義的一般形式為:struct 結(jié)構(gòu)體名 成員表列;成員的一般表達形式為:類型說明符 成員名;其中成員名屬于用戶自定義標(biāo)識符,同樣遵循用戶自定義標(biāo)識符的命名規(guī)則。范例10.1 PeopleIDcardInfo.c 身份證上通常包

3、括身份證持有人的姓名、性別、出生日期、籍貫等,使用C語言表示時,這些信息的格式各不相同。設(shè)計一個結(jié)構(gòu)體,存儲身份證信息。 10.2 結(jié)構(gòu)體變量 結(jié)構(gòu)體是一種構(gòu)造數(shù)據(jù)類型,C語言使用結(jié)構(gòu)體變量來對結(jié)構(gòu)體成員進行引用。定義結(jié)構(gòu)體變量不同于基本數(shù)據(jù)類型的定方式,它需要先定義結(jié)構(gòu)體類型,然后定義結(jié)構(gòu)體變量,或者定義結(jié)構(gòu)體類型的同時定義結(jié)構(gòu)體變量。 10.2.1 結(jié)構(gòu)體變量的定義 結(jié)構(gòu)體變量有兩種定義形式:一種是定義結(jié)構(gòu)體類型時定義結(jié)構(gòu)體變量,另一種是先定義結(jié)構(gòu)體,然后定義結(jié)構(gòu)體變量。結(jié)構(gòu)體變量的一般定義形式為:struct 結(jié)構(gòu)體名成員表列;變量名1,變量名2;或者省略結(jié)構(gòu)體名,直接定義結(jié)構(gòu)體變量:s

4、truct 成員表列;變量名1,變量名2;10.2.1 結(jié)構(gòu)體變量的定義 另外,也可以先定義結(jié)構(gòu)體類型,再定義結(jié)構(gòu)體變量:struct 結(jié)構(gòu)體名成員表列;struct 結(jié)構(gòu)體名 變量名1,變量名2;例如,記錄某次數(shù)學(xué)考試時學(xué)生張三的成績,可以使用下面的結(jié)構(gòu)體:struct MathScorechar name30; /成員1,定義姓名,char型數(shù)組namechar sex10; /成員2,定義性別,char型數(shù)組sexfloat score; /成員3,定義分數(shù),float型變量score;struct MathScore Zhangsan;/定義結(jié)構(gòu)體變量Zhangsan 10.2.2 結(jié)

5、構(gòu)體變量的初始化 1結(jié)構(gòu)體變量定義賦初值結(jié)構(gòu)體變量可以在定義時賦初值,例如:01struct MathScore0203char name30;04char sex10;05float score;06Student1 = “Zhangsan”, “Male”, 92;上述程序代碼定義了結(jié)構(gòu)體類型MathScore,同時定義了該類型的變量Student1,并賦初值,將字符串”Zhangsan”賦給成員name,將”Male”賦給成員sex,將數(shù)字92賦給成員score。注意,賦值時各成員的值應(yīng)一一對應(yīng),假如代碼第6行改為:Student = “Male”, ”Zhangsan”, 92;則程序

6、將字符串“Male”賦給成員name,將字符串”Zhangsan”賦給成員sex,將數(shù)字92賦給成員score。 10.2.2 結(jié)構(gòu)體變量的初始化 2結(jié)構(gòu)體變量成員賦初值結(jié)構(gòu)體變量定義后,不能使用一次賦值的方式對結(jié)構(gòu)體變量各個成員賦值,只能對每個成員單獨賦值。此時需要使用結(jié)構(gòu)體成員引用運算符”.”,即通過點號索引結(jié)構(gòu)體變量下面的各個成員。例如:01struct MathScore0203char name30;04char sex10;05float score;06Student1;07S = “Zhangsan”;/對結(jié)構(gòu)體變量Student1的成員name賦初值0

7、8Student1.sex = .“Male”; /對結(jié)構(gòu)體變量Student1的成員sex賦初值09Student1.score = 92; /對結(jié)構(gòu)體變量Student1的成員score賦初值 10.2.2 結(jié)構(gòu)體變量的初始化 3結(jié)構(gòu)體變量間的賦值若定義兩個類型完全相同的結(jié)構(gòu)體變量,當(dāng)其中一個變量賦初值后,可以將已賦值的變量整體賦值給另一個變量。例如:01struct MathScore0203char name30;/成員1,定義姓名,char型數(shù)組name04char sex10; /成員2,定義性別,char型數(shù)組sex05float score; /成員3,定義分數(shù),float型變

8、量score06Student1 = “Zhangsan”, “Male”, 92, StudentCopy;這里定義了兩個MathScore類型的結(jié)構(gòu)體變量Student1和StudentCopy,可以執(zhí)行如下定義:StudentCopy = Student1;單當(dāng)兩個結(jié)構(gòu)體變量類型不一致時,不能使用這種變量賦值的操作方式。 10.2.3 結(jié)構(gòu)體變量的引用 結(jié)構(gòu)體定義以后,在程序中通常不能對結(jié)構(gòu)體作為整體來操作,而只能通過引用結(jié)構(gòu)體的各個成員來實現(xiàn)對結(jié)構(gòu)體的使用。C語言中,結(jié)構(gòu)體變量定義以后可以通過結(jié)構(gòu)體成員引用運算符”.”索引結(jié)構(gòu)體內(nèi)所有的成員。例如,某結(jié)構(gòu)體IDcard中含有name、s

9、ex和Tel等成員。若定義了該結(jié)構(gòu)體類型的變量:struct IDcard YanSl, Zhangyc;則這兩個結(jié)構(gòu)體變量可以通過結(jié)構(gòu)體成員引用運算符引用每個成員:YanS = “Yan Shulei”;/為YanSl變量成員name賦值YanSl.sex = “Male”/為YanSl變量成員sex賦值Zhangyc.Tel = 123456;/為Zhangyc變量成員Tel賦值 范例10.2 BookInfo.c 書店管理圖書時需要將每本圖書的信息輸入到書庫中,包括書名、定價和作者等。設(shè)計一個結(jié)構(gòu)體,將一本名為C language Study的書的信息存儲為結(jié)構(gòu)體,作者為Wa

10、rd.Harfman,定價為80.65元。 10.2.4 結(jié)構(gòu)體數(shù)組 1結(jié)構(gòu)體數(shù)組的定義和結(jié)構(gòu)體變量類似,結(jié)構(gòu)體數(shù)組可以在結(jié)構(gòu)體類型定義時定義,也可以在結(jié)構(gòu)體類型定義完畢后單獨定義。例如,范例10.2中書籍的信息,可以再添加幾個成員如出版社、ISDN號以及書籍類型等。定義如下:01struct BookInfo0203char Name30;04char Author20;05float PublishedPrice;06char Publisher30;07float ISDN;08char Category30;09Book100;10.2.4 結(jié)構(gòu)體數(shù)組 2結(jié)構(gòu)體數(shù)組賦初值結(jié)構(gòu)體數(shù)組可以

11、在定義時賦初值,例如,存儲5個學(xué)生的某次數(shù)學(xué)成績,可以使用下面的定義:01struct Stu_math_Score0203char Name30;04char Sex;05int StuNo;06float Score;07StuInfo5 = 08“Zhangsan”, M, 1001, 86.5, 09 “Lijuan” , F, 1002, 95,10 “Wangjun”, M, 1003, 88.5,11 “Wangyi”, F, 1004, 92,12 “Chenli”, F, 1005, 94.513 ;實訓(xùn)10.1身份證信息錄入 每個人都有自己的身份證,身份證信息記錄了個人基本

12、的社會信息,包括姓名、性別、民族、出生日期、住址和身份證號碼。設(shè)計一個數(shù)據(jù)庫,存儲20個人的身份證信息。并輸出所有男性的身份信息。1需求分析:需求1:設(shè)計一個結(jié)構(gòu)體類型,用于存儲身份證信息需求2:輸入20個人的身份信息,并輸出男性信息2技術(shù)應(yīng)用對于需求1,定義結(jié)構(gòu)體IdentificationCard,成員變量有Name、Sex、Nationality、Birth_year、Birth_month、Birth_day、Addr和IDNo等,根據(jù)不同成員的功能設(shè)置為不同的數(shù)據(jù)類型。例如設(shè)置Sex為char型的數(shù)組。對于需求2,定義結(jié)構(gòu)體類型為IdentificationCard的結(jié)構(gòu)體數(shù)組Peo

13、pleInfo20,用于存儲20個人的身份信息。設(shè)計子函數(shù)void OutputMale(struct IdentificationCard PeopleInfoType20),輸出男性的信息。源代碼:PeopleIDInfo.c 10.2.5 結(jié)構(gòu)體的嵌套 1結(jié)構(gòu)體嵌套的定義結(jié)構(gòu)體嵌套的定義類似于函數(shù)的嵌套,應(yīng)先將內(nèi)層的結(jié)構(gòu)體定義在前面。例如,在作個人身份信息的定義時,需要定義人員的出生日期,為了詳細的表示人員的出生年月日,可以定義結(jié)構(gòu)體BirthDay:01struct BirthDay/定義出生日期結(jié)構(gòu)體BrithDay0203unsigned int year; /定義成員變量year

14、,表示年份04unsigned int month; /定義成員變量month,表示月份05unsigned int day; /定義成員變量day,表示日期06;對出生年月日重新定義,作為成員放在下面結(jié)構(gòu)體中:01struct IdentificationCard0203char Name30;04char Sex10;05char Nationality20;06struct BrithDay Birth;/定義結(jié)構(gòu)體成員Birth07char Addr80;08char IDNo20;09Zhangsan; 10.2.5 結(jié)構(gòu)體的嵌套 2結(jié)構(gòu)體嵌套的變量引用結(jié)構(gòu)體嵌套定義之后,可以使用結(jié)

15、構(gòu)體引用運算符進行兩次或多次引用。例如,上述代碼第9行同時定義了結(jié)構(gòu)體變量Zhangsan,該變量的Birth成員可以這樣引用:Zhangsan.Birth.year = 1984;/引用成員yearZhangsan.Birth.month = 11;/引用成員monthZhangsan.Birth.day = 23/引用成員day10.3 結(jié)構(gòu)體指針 C語言中,可以定義結(jié)構(gòu)體變量,也可以定義結(jié)構(gòu)體類型的指針。當(dāng)指針變量指向一個結(jié)構(gòu)體變量時,就將這個指針變量稱為結(jié)構(gòu)體指針變量,簡稱結(jié)構(gòu)體指針,此時,結(jié)構(gòu)體指針變量的值是它所指向的結(jié)構(gòu)體變量的首地址。此外,結(jié)構(gòu)體指針也常用于建立鏈表,用于作鏈表的

16、連接端點。 10.3.1 結(jié)構(gòu)體指針的定義 和普通指針變量類似,結(jié)構(gòu)體指針的定義也使用*作為指針定義的運算符,其一般表達形式為: struct 結(jié)構(gòu)體類型名 *結(jié)構(gòu)體指針變量名 可以定義下面的結(jié)構(gòu)體指針: struct BookInfo *pC_language_Study; 假如要使該結(jié)構(gòu)體指針指向某個結(jié)構(gòu)體變量,可以使用下面的賦值語句:pC_language_Study = &C_language_Study;另外,和定義結(jié)構(gòu)體變量類似,在定義結(jié)構(gòu)體類型時也可以定義結(jié)構(gòu)體指針。例如,要保存一個人的體檢結(jié)果,可以定義如下結(jié)構(gòu)體類型、結(jié)構(gòu)體變量和結(jié)構(gòu)體指針:01struct PhysicalE

17、xamInfo0203char Name30; /定義成員變量Name,表示姓名04float Height; /定義成員變量Height,表示身高05float Weight; /定義成員變量Weight,表示體重06float BloodPressure; /定義成員變量BloodPressure,表示血壓07float Eyesight; /定義成員變量Eyesight,表示視力08Stu1, Stu2, *pStu; /定義結(jié)構(gòu)體變量Stu1, Stu2和結(jié)構(gòu)體指針pStu09struct PhysicalExamInfo pStu = &Stu1; /使結(jié)構(gòu)體指針pStu指向結(jié)構(gòu)體變

18、量Stu1 10.3.2 結(jié)構(gòu)體指針引用結(jié)構(gòu)體成員 使用結(jié)構(gòu)體指針可以引用它所指的結(jié)構(gòu)體變量的每一個成員。和結(jié)構(gòu)體變量引用結(jié)構(gòu)體成員不同,結(jié)構(gòu)體指針引用各個成員時使-運算符,C語言中,該運算符由減號和右尖括號組合而成。例如,10.3.1節(jié)中定義的結(jié)構(gòu)體指針pStu可以使用下面的方法引用結(jié)構(gòu)體變量Stu1的各成員變量:pStu-Height = 185;/使用結(jié)構(gòu)體指針引用Stu1的成員Height,并賦值185pStu-Weight = 72; /使用結(jié)構(gòu)體指針引用Stu1的成員Weight,并賦值72printf(“Name: %sn”, pStu-Name); /輸出結(jié)構(gòu)體變量Stu1的成

19、員Name 范例10.3 StuSchoolInfo.c 設(shè)計一個結(jié)構(gòu)體,存儲某個學(xué)生的主要學(xué)籍信息,包括姓名、性別、班號和學(xué)號等,使用結(jié)構(gòu)體指針實現(xiàn)對結(jié)構(gòu)體變量成員的輸入和輸出。 10.3.3 指向結(jié)構(gòu)體數(shù)組的結(jié)構(gòu)體指針 結(jié)構(gòu)體指針也可以指向一個已定義的結(jié)構(gòu)體數(shù)組,結(jié)構(gòu)體指針可以指向結(jié)構(gòu)體數(shù)組的首地址,也可以指向結(jié)構(gòu)體數(shù)組的某個元素地址??梢酝ㄟ^結(jié)構(gòu)體指針值的遞增和遞減改變其所指的元素,例如,定義了一個通訊錄結(jié)構(gòu)體:01struct AddrBook0203char Name30;04char MobilePhone20;05char Addr50;06unsigned int ZipCod

20、e;07;08struct AddrBook Friends20, Family30, SchoolMates30;09struct AddrBook *pAddrBook;上述代碼中第8行定義了三個AddrBook類型的結(jié)構(gòu)體數(shù)組Friends、Family和SchoolMates,維數(shù)分別為20、30和30。可以使用下面的代碼通過指針pAddrBook索引各個結(jié)構(gòu)體數(shù)組元素的成員:01pAddrBook = Friends;/將pAddrBook指向結(jié)構(gòu)體數(shù)組Friends首地址02scanf(“%s”, pAddrBook-Name);03scanf(“%s”, pAddrBook-Mo

21、bilePhone);04scanf(“%s”, pAddrBook-Addr);05scanf(“%u”, pAddrBook-ZipCode);06pAddrBook+;/使指針pAddrBook指向第二個結(jié)構(gòu)體數(shù)組元素07scanf(“%s”, pAddrBook-MobilePhone);mnpAddrBook = &Family10;/使指針pAddrBook指向結(jié)構(gòu)體數(shù)組Family的第11個元素mn+1scanf(“%s”, pAddrBook-Name); 10.4 結(jié)構(gòu)體變量的內(nèi)存分配 由于結(jié)構(gòu)體類型是構(gòu)造類型,其內(nèi)部各個成員可以是各種數(shù)據(jù)類型結(jié)構(gòu),因此,結(jié)構(gòu)體變量或結(jié)構(gòu)體數(shù)

22、組在內(nèi)存中的存儲結(jié)構(gòu)也和普通數(shù)據(jù)類型不同。與普通數(shù)據(jù)類型相比,結(jié)構(gòu)體在內(nèi)存中的邏輯結(jié)構(gòu)更復(fù)雜,占用內(nèi)存也更多。 10.4.1 動態(tài)分配結(jié)構(gòu)體內(nèi)存 分配內(nèi)存空間可以使用malloc函數(shù),也可以使用另一個內(nèi)存分配庫函數(shù)calloc。1malloc分配動態(tài)內(nèi)存使用malloc函數(shù)分配結(jié)構(gòu)體類型的動態(tài)內(nèi)存空間,可以借助sizeof運算符計算結(jié)構(gòu)體的內(nèi)存字節(jié)數(shù),然后按需要分配內(nèi)存塊。例如,設(shè)計一個簡單的機動車駕駛證模版,包括注冊號(RegisterCode)、車種(Sedan)、持有人(Owner)和引擎號(EngineCode)等,可以使用下面的結(jié)構(gòu)體:01struct TheLicenseOfMot

23、orVehiclesOfPRC0203char RegisterCode20;04char Type20;05char Owner30;06char EngineCode20;07;定義結(jié)構(gòu)體類型后,可以使用sizeof運算符獲取該結(jié)構(gòu)體類型所占的內(nèi)存字節(jié)大小,表達方式為:int i = 0;i = sizeof(struct TheLicenseOfMotorVehiclesOfPRC);10.4.1 動態(tài)分配結(jié)構(gòu)體內(nèi)存 上述兩條語句表示計算結(jié)構(gòu)體類型TheLicenseOfMotorVehiclesOfPRC在內(nèi)存中的字節(jié)大小,并將結(jié)果賦給int型變量i。使用malloc函數(shù)可以分配需要的

24、內(nèi)存空間,表達方式為:struct TheLicenseOfMotorVehiclesOfPRC *pMotorVehicles;pMotorVehicles = (struct TheLicenseOfMotorVehiclesOfPRC *)malloc(i * 100);上述第一行代碼表示定義了一TheLicenseOfMotorVehiclesOfPRC結(jié)構(gòu)體類型的指針變量pMotorVehicles,第二行代碼表示分配了100個結(jié)構(gòu)體類型的連續(xù)內(nèi)存區(qū)域。范例10.4 CarInfo.c 汽車銷售系統(tǒng)中通常有一個簡單的汽車搜索界面,包括車型、車名、車牌號、排量和價格等。設(shè)計一個簡單的結(jié)

25、構(gòu)體模版,用于汽車銷售系統(tǒng)的搜索界面數(shù)據(jù)庫。動態(tài)分配一定的內(nèi)存空間,存儲已有的各種類型的汽車信息。 10.4.1 動態(tài)分配結(jié)構(gòu)體內(nèi)存 2calloc分配動態(tài)內(nèi)存calloc函數(shù)也用于分配內(nèi)存空間。其一般調(diào)用形式為:(類型說明符 *)calloc(n,size)calloc函數(shù)使用兩個參數(shù)表示分配的內(nèi)存空間大小。兩個參數(shù)n和size的作用是在內(nèi)存動態(tài)存儲區(qū)中分配n塊長度為size字節(jié)的連續(xù)存儲區(qū)域。函數(shù)的返回值為該區(qū)域的首地址。(類型說明符*)用于強制類型轉(zhuǎn)換。例如,定義了通訊錄結(jié)構(gòu)體模版和相對應(yīng)的結(jié)構(gòu)體指針:01struct AddrBook0203char Name30;04char Mob

26、ilePhone20;05char Addr50;06unsigned int ZipCode;07;08struct AddrBook *pAddrBook;可以使用calloc函數(shù)分配100個AddrBook結(jié)構(gòu)體類型的內(nèi)存區(qū)域,并將該內(nèi)存區(qū)域的首地址賦給指針pAddrBook,執(zhí)行方法為:pAddrBook = (struct AddrBook *)calloc(100, sizeof(struct AddrBook);10.4.2 結(jié)構(gòu)體在內(nèi)存中的存儲結(jié)構(gòu) 1結(jié)構(gòu)體首地址選擇結(jié)構(gòu)體變量的首地址必須能夠被其最寬的基本數(shù)據(jù)類型成員的大小所整除。例如,定義如下結(jié)構(gòu)體:struct Test1

27、char c;int i;struct Test1 ForTest;運行語句:printf(“%dn”, sizeof(ForTest);輸出結(jié)果為8,這是因為系統(tǒng)需要作字節(jié)對齊。結(jié)構(gòu)體Test1最寬的成員為長度為4字節(jié)的int型變量i,因此,結(jié)構(gòu)體變量ForTest的首地址要能夠被4整除,而變量i的地址也要被4整除,因此,為了滿足這些需求,要在char型變量c和int型變量i之間加入填充字節(jié)。如圖所示為結(jié)構(gòu)體Test1的內(nèi)存結(jié)構(gòu)示意圖。 10.4.2 結(jié)構(gòu)體在內(nèi)存中的存儲結(jié)構(gòu) 2結(jié)構(gòu)體成員地址結(jié)構(gòu)體每個成員相對于結(jié)構(gòu)體首地址的偏移量(offset)都是成員大小的整數(shù)倍,當(dāng)不滿足這一要求時將在

28、成員之間加上填充字節(jié)。3結(jié)構(gòu)體總字節(jié)數(shù)結(jié)構(gòu)體的總字節(jié)數(shù)等于結(jié)構(gòu)體最寬基本類型成員大小的整數(shù)倍。當(dāng)不滿足這一要求時,將在最后一個成員后面添加填充字節(jié)。4嵌套結(jié)構(gòu)體類型當(dāng)有嵌套結(jié)構(gòu)體類型時,內(nèi)部的嵌套結(jié)構(gòu)體類型以其最大基本數(shù)據(jù)類型成員的大小為準(zhǔn)。例如,定義一個人員基本信息的結(jié)構(gòu)體:01struct BirthDay0203int year;04short month;05short day;06;07struct PeopleInfo0809char Name20;10char Sex;11struct BirthDay birth;12;13struct PeopleInfo Lihong;10

29、.4.2 結(jié)構(gòu)體在內(nèi)存中的存儲結(jié)構(gòu) 上述定義執(zhí)行語句:printf(“%dn”, sizeof(PeopleInfo);輸出結(jié)果為32,上述定義中,由于PeopleInfo結(jié)構(gòu)體類型中最大的成員寬度為struct BirthDay birth,其長度按照內(nèi)部最大的基本數(shù)據(jù)類型int year計算,為4,因此,struct BirthDay birth成員前面的所有成員地址應(yīng)該能夠被4整除。因此,成員Sex后應(yīng)該有3個填充字節(jié)。如圖所示為結(jié)構(gòu)體類型PeopleInfo的內(nèi)存結(jié)構(gòu)示意圖。 10.5 結(jié)構(gòu)體指針作函數(shù)參數(shù) 結(jié)構(gòu)體變量和結(jié)構(gòu)體指針都可以作為函數(shù)參數(shù)進行傳遞。但使用結(jié)構(gòu)體變量作函數(shù)傳遞時

30、,需要傳送結(jié)構(gòu)體中的每個成員,當(dāng)結(jié)構(gòu)體成員比較多時,將給程序帶來很大不便??梢允褂媒Y(jié)構(gòu)體指針或結(jié)構(gòu)體名實現(xiàn)結(jié)構(gòu)體變量向子函數(shù)的傳遞,這樣傳遞到子函數(shù)形參的僅僅是內(nèi)存的地址,因此可以大大減少程序執(zhí)行時時間和空間的開銷。 10.5.1 結(jié)構(gòu)體指針作函數(shù)參數(shù)的定義 子函數(shù)定義時形參的類型應(yīng)與傳入的實參類型相同。1結(jié)構(gòu)體數(shù)組名作函數(shù)參數(shù)當(dāng)使用結(jié)構(gòu)體數(shù)組名作函數(shù)參數(shù)時,形參可以使用結(jié)構(gòu)體數(shù)組,也可以使用結(jié)構(gòu)體指針類型。例如,定義結(jié)構(gòu)體:01struct Test0203short Input;04int Output;05ForTest10;可以定義下面的函數(shù)將結(jié)構(gòu)體數(shù)組ForTest的首地址傳入函數(shù)體

31、:void TestStr(struct Test VisualArray10) 函數(shù)體可以通過下面的語句調(diào)用該子函數(shù),并將結(jié)構(gòu)體數(shù)組ForTest首地址傳遞給形參:TestStr ( ForTest );這樣定義的缺點是形參struct Test VisualArray10中數(shù)組名VisualArray不能作為指針使用,由于數(shù)組名是地址常量,因此不能對自身做算術(shù)運算。優(yōu)點是可以通過形參數(shù)組常量表達式的大小,明確限定所要處理的實參傳入的內(nèi)存塊的大小。 10.5.1 結(jié)構(gòu)體指針作函數(shù)參數(shù)的定義 2結(jié)構(gòu)體變量作函數(shù)參數(shù)在上述結(jié)構(gòu)體Test定義的基礎(chǔ)上,定義:struct Test *pForTes

32、t; /定義結(jié)構(gòu)體指針pForTestpForTest = (struct Test *)malloc(100 * sizeof(struct Test);/分配100個Test結(jié)構(gòu)體類型的內(nèi)存若定義子函數(shù):void TestStr2(struct Test *pVisualTest)函數(shù)體此時可以調(diào)用子函數(shù)TestStr2,并將動態(tài)分配的內(nèi)存區(qū)域首地址傳遞給形參:TestStr2 ( pForTest ); 10.5.2 結(jié)構(gòu)體指針作函數(shù)參數(shù)的應(yīng)用 實際程序設(shè)計中結(jié)構(gòu)體指針作函數(shù)參數(shù)應(yīng)用非常廣泛,通常對數(shù)據(jù)庫的遍歷、計算等均可以通過結(jié)構(gòu)體指針實現(xiàn)。范例10.5 CalcAverageAge.

33、c 有一個工作小組,為更好的掌握小組中各成員的工作能力,需要統(tǒng)計該組人員中男性和女性的平均年齡。試設(shè)計一個子函數(shù),實現(xiàn)這一功能,分別打印出男性和女性的平均年齡。 10.6 共用體的定義 C語言中另外一種常用的構(gòu)造類型是共用體,和結(jié)構(gòu)體類似,共用體也由其他基本數(shù)據(jù)結(jié)構(gòu)組合而成,但在內(nèi)存結(jié)構(gòu)中結(jié)構(gòu)體和共用體卻有本質(zhì)區(qū)別。 10.6.1 共用體的定義C語言中,共用體使用關(guān)鍵字union定義,其定義的一般表達形式為:union 共用體名成員表列;其中,共用體名屬于用戶自定義標(biāo)識符,遵循用戶自定義標(biāo)識符的命名規(guī)則。成員表列中可以包含一個或多個共用體成員。共用體成員的一般表達形式為:類型說明符 成員名;成員名的命名應(yīng)符合標(biāo)識符的規(guī)定。例如,有如下的共用體定義:01union data0203int temp;04char stable10;05;上述代碼定義了一個名為data的共用體類型,它含有兩個成員,一個為整型,成員名為temp;另一個為字符數(shù)組,數(shù)組名為stable。和結(jié)構(gòu)體類似,共用體定義之后,就可以定義該類型的共用體變量。 10.6.2 共用體變量的定義與應(yīng)用 共用體變量的定義和結(jié)構(gòu)體類似,可

溫馨提示

  • 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論