版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、第10章 結(jié)構(gòu)體與共用體 本章的學(xué)習(xí)重點(diǎn)結(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ǎn)稱為結(jié)構(gòu)。C語(yǔ)言中,可以按照程序設(shè)計(jì)需求定義結(jié)構(gòu)體類型,將多個(gè)相關(guān)的變量封裝起來(lái),成為一個(gè)有機(jī)的整體,這樣的結(jié)構(gòu)就是結(jié)構(gòu)體。例如,要存儲(chǔ)一個(gè)班級(jí)的信息,包括班號(hào)、男生人數(shù)、女生人數(shù)和班主任姓名等,可以將這些信息封裝成下面的格式:班號(hào)班主任姓名男生人數(shù)女生人數(shù)C語(yǔ)言規(guī)定了使用結(jié)構(gòu)體封裝其他數(shù)據(jù)類型的方式,并且可以對(duì)這些封裝命名。結(jié)構(gòu)體使用str
2、uct來(lái)定義其類型,例如,上述班級(jí)信息使用結(jié)構(gòu)體定義為:struct ClassInfoint ClassNumber;/成員1,定義班號(hào)char ClassAdministratorName30;/成員2,定義班主任姓名int MaleNumber;/成員3,定義男生人數(shù)int FamaleNumber;/成員4,定義女生人數(shù);10.1 結(jié)構(gòu)體的定義 C語(yǔ)言中,結(jié)構(gòu)體定義的一般形式為:struct 結(jié)構(gòu)體名 成員表列;成員的一般表達(dá)形式為:類型說(shuō)明符 成員名;其中成員名屬于用戶自定義標(biāo)識(shí)符,同樣遵循用戶自定義標(biāo)識(shí)符的命名規(guī)則。范例10.1 PeopleIDcardInfo.c 身份證上通常包
3、括身份證持有人的姓名、性別、出生日期、籍貫等,使用C語(yǔ)言表示時(shí),這些信息的格式各不相同。設(shè)計(jì)一個(gè)結(jié)構(gòu)體,存儲(chǔ)身份證信息。 10.2 結(jié)構(gòu)體變量 結(jié)構(gòu)體是一種構(gòu)造數(shù)據(jù)類型,C語(yǔ)言使用結(jié)構(gòu)體變量來(lái)對(duì)結(jié)構(gòu)體成員進(jìn)行引用。定義結(jié)構(gòu)體變量不同于基本數(shù)據(jù)類型的定方式,它需要先定義結(jié)構(gòu)體類型,然后定義結(jié)構(gòu)體變量,或者定義結(jié)構(gòu)體類型的同時(shí)定義結(jié)構(gòu)體變量。 10.2.1 結(jié)構(gòu)體變量的定義 結(jié)構(gòu)體變量有兩種定義形式:一種是定義結(jié)構(gòu)體類型時(shí)定義結(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é)考試時(shí)學(xué)生張三的成績(jī),可以使用下面的結(jié)構(gòu)體:struct MathScorechar name30; /成員1,定義姓名,char型數(shù)組namechar sex10; /成員2,定義性別,char型數(shù)組sexfloat score; /成員3,定義分?jǐn)?shù),float型變量score;struct MathScore Zhangsan;/定義結(jié)構(gòu)體變量Zhangsan 10.2.2 結(jié)
5、構(gòu)體變量的初始化 1結(jié)構(gòu)體變量定義賦初值結(jié)構(gòu)體變量可以在定義時(shí)賦初值,例如:01struct MathScore0203char name30;04char sex10;05float score;06Student1 = “Zhangsan”, “Male”, 92;上述程序代碼定義了結(jié)構(gòu)體類型MathScore,同時(shí)定義了該類型的變量Student1,并賦初值,將字符串”Zhangsan”賦給成員name,將”Male”賦給成員sex,將數(shù)字92賦給成員score。注意,賦值時(shí)各成員的值應(yīng)一一對(duì)應(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)體變量定義后,不能使用一次賦值的方式對(duì)結(jié)構(gòu)體變量各個(gè)成員賦值,只能對(duì)每個(gè)成員單獨(dú)賦值。此時(shí)需要使用結(jié)構(gòu)體成員引用運(yùn)算符”.”,即通過(guò)點(diǎn)號(hào)索引結(jié)構(gòu)體變量下面的各個(gè)成員。例如:01struct MathScore0203char name30;04char sex10;05float score;06Student1;07S = “Zhangsan”;/對(duì)結(jié)構(gòu)體變量Student1的成員name賦初值0
7、8Student1.sex = .“Male”; /對(duì)結(jié)構(gòu)體變量Student1的成員sex賦初值09Student1.score = 92; /對(duì)結(jié)構(gòu)體變量Student1的成員score賦初值 10.2.2 結(jié)構(gòu)體變量的初始化 3結(jié)構(gòu)體變量間的賦值若定義兩個(gè)類型完全相同的結(jié)構(gòu)體變量,當(dāng)其中一個(gè)變量賦初值后,可以將已賦值的變量整體賦值給另一個(gè)變量。例如:01struct MathScore0203char name30;/成員1,定義姓名,char型數(shù)組name04char sex10; /成員2,定義性別,char型數(shù)組sex05float score; /成員3,定義分?jǐn)?shù),float型變
8、量score06Student1 = “Zhangsan”, “Male”, 92, StudentCopy;這里定義了兩個(gè)MathScore類型的結(jié)構(gòu)體變量Student1和StudentCopy,可以執(zhí)行如下定義:StudentCopy = Student1;單當(dāng)兩個(gè)結(jié)構(gòu)體變量類型不一致時(shí),不能使用這種變量賦值的操作方式。 10.2.3 結(jié)構(gòu)體變量的引用 結(jié)構(gòu)體定義以后,在程序中通常不能對(duì)結(jié)構(gòu)體作為整體來(lái)操作,而只能通過(guò)引用結(jié)構(gòu)體的各個(gè)成員來(lái)實(shí)現(xiàn)對(duì)結(jié)構(gòu)體的使用。C語(yǔ)言中,結(jié)構(gòu)體變量定義以后可以通過(guò)結(jié)構(gòu)體成員引用運(yùn)算符”.”索引結(jié)構(gòu)體內(nèi)所有的成員。例如,某結(jié)構(gòu)體IDcard中含有name、s
9、ex和Tel等成員。若定義了該結(jié)構(gòu)體類型的變量:struct IDcard YanSl, Zhangyc;則這兩個(gè)結(jié)構(gòu)體變量可以通過(guò)結(jié)構(gòu)體成員引用運(yùn)算符引用每個(gè)成員:YanS = “Yan Shulei”;/為YanSl變量成員name賦值YanSl.sex = “Male”/為YanSl變量成員sex賦值Zhangyc.Tel = 123456;/為Zhangyc變量成員Tel賦值 范例10.2 BookInfo.c 書店管理圖書時(shí)需要將每本圖書的信息輸入到書庫(kù)中,包括書名、定價(jià)和作者等。設(shè)計(jì)一個(gè)結(jié)構(gòu)體,將一本名為C language Study的書的信息存儲(chǔ)為結(jié)構(gòu)體,作者為Wa
10、rd.Harfman,定價(jià)為80.65元。 10.2.4 結(jié)構(gòu)體數(shù)組 1結(jié)構(gòu)體數(shù)組的定義和結(jié)構(gòu)體變量類似,結(jié)構(gòu)體數(shù)組可以在結(jié)構(gòu)體類型定義時(shí)定義,也可以在結(jié)構(gòu)體類型定義完畢后單獨(dú)定義。例如,范例10.2中書籍的信息,可以再添加幾個(gè)成員如出版社、ISDN號(hào)以及書籍類型等。定義如下: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、在定義時(shí)賦初值,例如,存儲(chǔ)5個(gè)學(xué)生的某次數(shù)學(xué)成績(jī),可以使用下面的定義: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 ;實(shí)訓(xùn)10.1身份證信息錄入 每個(gè)人都有自己的身份證,身份證信息記錄了個(gè)人基本
12、的社會(huì)信息,包括姓名、性別、民族、出生日期、住址和身份證號(hào)碼。設(shè)計(jì)一個(gè)數(shù)據(jù)庫(kù),存儲(chǔ)20個(gè)人的身份證信息。并輸出所有男性的身份信息。1需求分析:需求1:設(shè)計(jì)一個(gè)結(jié)構(gòu)體類型,用于存儲(chǔ)身份證信息需求2:輸入20個(gè)人的身份信息,并輸出男性信息2技術(shù)應(yīng)用對(duì)于需求1,定義結(jié)構(gòu)體IdentificationCard,成員變量有Name、Sex、Nationality、Birth_year、Birth_month、Birth_day、Addr和IDNo等,根據(jù)不同成員的功能設(shè)置為不同的數(shù)據(jù)類型。例如設(shè)置Sex為char型的數(shù)組。對(duì)于需求2,定義結(jié)構(gòu)體類型為IdentificationCard的結(jié)構(gòu)體數(shù)組Peo
13、pleInfo20,用于存儲(chǔ)20個(gè)人的身份信息。設(shè)計(jì)子函數(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)體定義在前面。例如,在作個(gè)人身份信息的定義時(shí),需要定義人員的出生日期,為了詳細(xì)的表示人員的出生年月日,可以定義結(jié)構(gòu)體BirthDay:01struct BirthDay/定義出生日期結(jié)構(gòu)體BrithDay0203unsigned int year; /定義成員變量year
14、,表示年份04unsigned int month; /定義成員變量month,表示月份05unsigned int day; /定義成員變量day,表示日期06;對(duì)出生年月日重新定義,作為成員放在下面結(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)體引用運(yùn)算符進(jìn)行兩次或多次引用。例如,上述代碼第9行同時(shí)定義了結(jié)構(gòu)體變量Zhangsan,該變量的Birth成員可以這樣引用:Zhangsan.Birth.year = 1984;/引用成員yearZhangsan.Birth.month = 11;/引用成員monthZhangsan.Birth.day = 23/引用成員day10.3 結(jié)構(gòu)體指針 C語(yǔ)言中,可以定義結(jié)構(gòu)體變量,也可以定義結(jié)構(gòu)體類型的指針。當(dāng)指針變量指向一個(gè)結(jié)構(gòu)體變量時(shí),就將這個(gè)指針變量稱為結(jié)構(gòu)體指針變量,簡(jiǎn)稱結(jié)構(gòu)體指針,此時(shí),結(jié)構(gòu)體指針變量的值是它所指向的結(jié)構(gòu)體變量的首地址。此外,結(jié)構(gòu)體指針也常用于建立鏈表,用于作鏈表的
16、連接端點(diǎn)。 10.3.1 結(jié)構(gòu)體指針的定義 和普通指針變量類似,結(jié)構(gòu)體指針的定義也使用*作為指針定義的運(yùn)算符,其一般表達(dá)形式為: struct 結(jié)構(gòu)體類型名 *結(jié)構(gòu)體指針變量名 可以定義下面的結(jié)構(gòu)體指針: struct BookInfo *pC_language_Study; 假如要使該結(jié)構(gòu)體指針指向某個(gè)結(jié)構(gòu)體變量,可以使用下面的賦值語(yǔ)句:pC_language_Study = &C_language_Study;另外,和定義結(jié)構(gòu)體變量類似,在定義結(jié)構(gòu)體類型時(shí)也可以定義結(jié)構(gòu)體指針。例如,要保存一個(gè)人的體檢結(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)體變量的每一個(gè)成員。和結(jié)構(gòu)體變量引用結(jié)構(gòu)體成員不同,結(jié)構(gòu)體指針引用各個(gè)成員時(shí)使-運(yùn)算符,C語(yǔ)言中,該運(yùn)算符由減號(hào)和右尖括號(hào)組合而成。例如,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è)計(jì)一個(gè)結(jié)構(gòu)體,存儲(chǔ)某個(gè)學(xué)生的主要學(xué)籍信息,包括姓名、性別、班號(hào)和學(xué)號(hào)等,使用結(jié)構(gòu)體指針實(shí)現(xiàn)對(duì)結(jié)構(gòu)體變量成員的輸入和輸出。 10.3.3 指向結(jié)構(gòu)體數(shù)組的結(jié)構(gòu)體指針 結(jié)構(gòu)體指針也可以指向一個(gè)已定義的結(jié)構(gòu)體數(shù)組,結(jié)構(gòu)體指針可以指向結(jié)構(gòu)體數(shù)組的首地址,也可以指向結(jié)構(gòu)體數(shù)組的某個(gè)元素地址??梢酝ㄟ^(guò)結(jié)構(gòu)體指針值的遞增和遞減改變其所指的元素,例如,定義了一個(gè)通訊錄結(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行定義了三個(gè)AddrBook類型的結(jié)構(gòu)體數(shù)組Friends、Family和SchoolMates,維數(shù)分別為20、30和30。可以使用下面的代碼通過(guò)指針pAddrBook索引各個(gè)結(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指向第二個(gè)結(jié)構(gòu)體數(shù)組元素07scanf(“%s”, pAddrBook-MobilePhone);mnpAddrBook = &Family10;/使指針pAddrBook指向結(jié)構(gòu)體數(shù)組Family的第11個(gè)元素mn+1scanf(“%s”, pAddrBook-Name); 10.4 結(jié)構(gòu)體變量的內(nèi)存分配 由于結(jié)構(gòu)體類型是構(gòu)造類型,其內(nèi)部各個(gè)成員可以是各種數(shù)據(jù)類型結(jié)構(gòu),因此,結(jié)構(gòu)體變量或結(jié)構(gòu)體數(shù)
22、組在內(nèi)存中的存儲(chǔ)結(jié)構(gòu)也和普通數(shù)據(jù)類型不同。與普通數(shù)據(jù)類型相比,結(jié)構(gòu)體在內(nèi)存中的邏輯結(jié)構(gòu)更復(fù)雜,占用內(nèi)存也更多。 10.4.1 動(dòng)態(tài)分配結(jié)構(gòu)體內(nèi)存 分配內(nèi)存空間可以使用malloc函數(shù),也可以使用另一個(gè)內(nèi)存分配庫(kù)函數(shù)calloc。1malloc分配動(dòng)態(tài)內(nèi)存使用malloc函數(shù)分配結(jié)構(gòu)體類型的動(dòng)態(tài)內(nèi)存空間,可以借助sizeof運(yùn)算符計(jì)算結(jié)構(gòu)體的內(nèi)存字節(jié)數(shù),然后按需要分配內(nèi)存塊。例如,設(shè)計(jì)一個(gè)簡(jiǎn)單的機(jī)動(dòng)車駕駛證模版,包括注冊(cè)號(hào)(RegisterCode)、車種(Sedan)、持有人(Owner)和引擎號(hào)(EngineCode)等,可以使用下面的結(jié)構(gòu)體:01struct TheLicenseOfMot
23、orVehiclesOfPRC0203char RegisterCode20;04char Type20;05char Owner30;06char EngineCode20;07;定義結(jié)構(gòu)體類型后,可以使用sizeof運(yùn)算符獲取該結(jié)構(gòu)體類型所占的內(nèi)存字節(jié)大小,表達(dá)方式為:int i = 0;i = sizeof(struct TheLicenseOfMotorVehiclesOfPRC);10.4.1 動(dòng)態(tài)分配結(jié)構(gòu)體內(nèi)存 上述兩條語(yǔ)句表示計(jì)算結(jié)構(gòu)體類型TheLicenseOfMotorVehiclesOfPRC在內(nèi)存中的字節(jié)大小,并將結(jié)果賦給int型變量i。使用malloc函數(shù)可以分配需要的
24、內(nèi)存空間,表達(dá)方式為:struct TheLicenseOfMotorVehiclesOfPRC *pMotorVehicles;pMotorVehicles = (struct TheLicenseOfMotorVehiclesOfPRC *)malloc(i * 100);上述第一行代碼表示定義了一TheLicenseOfMotorVehiclesOfPRC結(jié)構(gòu)體類型的指針變量pMotorVehicles,第二行代碼表示分配了100個(gè)結(jié)構(gòu)體類型的連續(xù)內(nèi)存區(qū)域。范例10.4 CarInfo.c 汽車銷售系統(tǒng)中通常有一個(gè)簡(jiǎn)單的汽車搜索界面,包括車型、車名、車牌號(hào)、排量和價(jià)格等。設(shè)計(jì)一個(gè)簡(jiǎn)單的結(jié)
25、構(gòu)體模版,用于汽車銷售系統(tǒng)的搜索界面數(shù)據(jù)庫(kù)。動(dòng)態(tài)分配一定的內(nèi)存空間,存儲(chǔ)已有的各種類型的汽車信息。 10.4.1 動(dòng)態(tài)分配結(jié)構(gòu)體內(nèi)存 2calloc分配動(dòng)態(tài)內(nèi)存calloc函數(shù)也用于分配內(nèi)存空間。其一般調(diào)用形式為:(類型說(shuō)明符 *)calloc(n,size)calloc函數(shù)使用兩個(gè)參數(shù)表示分配的內(nèi)存空間大小。兩個(gè)參數(shù)n和size的作用是在內(nèi)存動(dòng)態(tài)存儲(chǔ)區(qū)中分配n塊長(zhǎng)度為size字節(jié)的連續(xù)存儲(chǔ)區(qū)域。函數(shù)的返回值為該區(qū)域的首地址。(類型說(shuō)明符*)用于強(qiáng)制類型轉(zhuǎn)換。例如,定義了通訊錄結(jié)構(gòu)體模版和相對(duì)應(yīng)的結(jié)構(gòu)體指針:01struct AddrBook0203char Name30;04char Mob
26、ilePhone20;05char Addr50;06unsigned int ZipCode;07;08struct AddrBook *pAddrBook;可以使用calloc函數(shù)分配100個(gè)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)存中的存儲(chǔ)結(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;運(yùn)行語(yǔ)句:printf(“%dn”, sizeof(ForTest);輸出結(jié)果為8,這是因?yàn)橄到y(tǒng)需要作字節(jié)對(duì)齊。結(jié)構(gòu)體Test1最寬的成員為長(zhǎng)度為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)存中的存儲(chǔ)結(jié)構(gòu) 2結(jié)構(gòu)體成員地址結(jié)構(gòu)體每個(gè)成員相對(duì)于結(jié)構(gòu)體首地址的偏移量(offset)都是成員大小的整數(shù)倍,當(dāng)不滿足這一要求時(shí)將在
28、成員之間加上填充字節(jié)。3結(jié)構(gòu)體總字節(jié)數(shù)結(jié)構(gòu)體的總字節(jié)數(shù)等于結(jié)構(gòu)體最寬基本類型成員大小的整數(shù)倍。當(dāng)不滿足這一要求時(shí),將在最后一個(gè)成員后面添加填充字節(jié)。4嵌套結(jié)構(gòu)體類型當(dāng)有嵌套結(jié)構(gòu)體類型時(shí),內(nèi)部的嵌套結(jié)構(gòu)體類型以其最大基本數(shù)據(jù)類型成員的大小為準(zhǔn)。例如,定義一個(gè)人員基本信息的結(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)存中的存儲(chǔ)結(jié)構(gòu) 上述定義執(zhí)行語(yǔ)句:printf(“%dn”, sizeof(PeopleInfo);輸出結(jié)果為32,上述定義中,由于PeopleInfo結(jié)構(gòu)體類型中最大的成員寬度為struct BirthDay birth,其長(zhǎng)度按照內(nèi)部最大的基本數(shù)據(jù)類型int year計(jì)算,為4,因此,struct BirthDay birth成員前面的所有成員地址應(yīng)該能夠被4整除。因此,成員Sex后應(yīng)該有3個(gè)填充字節(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ù)進(jìn)行傳遞。但使用結(jié)構(gòu)體變量作函數(shù)傳遞時(shí)
30、,需要傳送結(jié)構(gòu)體中的每個(gè)成員,當(dāng)結(jié)構(gòu)體成員比較多時(shí),將給程序帶來(lái)很大不便??梢允褂媒Y(jié)構(gòu)體指針或結(jié)構(gòu)體名實(shí)現(xiàn)結(jié)構(gòu)體變量向子函數(shù)的傳遞,這樣傳遞到子函數(shù)形參的僅僅是內(nèi)存的地址,因此可以大大減少程序執(zhí)行時(shí)時(shí)間和空間的開(kāi)銷。 10.5.1 結(jié)構(gòu)體指針作函數(shù)參數(shù)的定義 子函數(shù)定義時(shí)形參的類型應(yīng)與傳入的實(shí)參類型相同。1結(jié)構(gòu)體數(shù)組名作函數(shù)參數(shù)當(dāng)使用結(jié)構(gòu)體數(shù)組名作函數(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ù)體可以通過(guò)下面的語(yǔ)句調(diào)用該子函數(shù),并將結(jié)構(gòu)體數(shù)組ForTest首地址傳遞給形參:TestStr ( ForTest );這樣定義的缺點(diǎn)是形參struct Test VisualArray10中數(shù)組名VisualArray不能作為指針使用,由于數(shù)組名是地址常量,因此不能對(duì)自身做算術(shù)運(yùn)算。優(yōu)點(diǎn)是可以通過(guò)形參數(shù)組常量表達(dá)式的大小,明確限定所要處理的實(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個(gè)Test結(jié)構(gòu)體類型的內(nèi)存若定義子函數(shù):void TestStr2(struct Test *pVisualTest)函數(shù)體此時(shí)可以調(diào)用子函數(shù)TestStr2,并將動(dòng)態(tài)分配的內(nèi)存區(qū)域首地址傳遞給形參:TestStr2 ( pForTest ); 10.5.2 結(jié)構(gòu)體指針作函數(shù)參數(shù)的應(yīng)用 實(shí)際程序設(shè)計(jì)中結(jié)構(gòu)體指針作函數(shù)參數(shù)應(yīng)用非常廣泛,通常對(duì)數(shù)據(jù)庫(kù)的遍歷、計(jì)算等均可以通過(guò)結(jié)構(gòu)體指針實(shí)現(xiàn)。范例10.5 CalcAverageAge.
33、c 有一個(gè)工作小組,為更好的掌握小組中各成員的工作能力,需要統(tǒng)計(jì)該組人員中男性和女性的平均年齡。試設(shè)計(jì)一個(gè)子函數(shù),實(shí)現(xiàn)這一功能,分別打印出男性和女性的平均年齡。 10.6 共用體的定義 C語(yǔ)言中另外一種常用的構(gòu)造類型是共用體,和結(jié)構(gòu)體類似,共用體也由其他基本數(shù)據(jù)結(jié)構(gòu)組合而成,但在內(nèi)存結(jié)構(gòu)中結(jié)構(gòu)體和共用體卻有本質(zhì)區(qū)別。 10.6.1 共用體的定義C語(yǔ)言中,共用體使用關(guān)鍵字union定義,其定義的一般表達(dá)形式為:union 共用體名成員表列;其中,共用體名屬于用戶自定義標(biāo)識(shí)符,遵循用戶自定義標(biāo)識(shí)符的命名規(guī)則。成員表列中可以包含一個(gè)或多個(gè)共用體成員。共用體成員的一般表達(dá)形式為:類型說(shuō)明符 成員名;成員名的命名應(yīng)符合標(biāo)識(shí)符的規(guī)定。例如,有如下的共用體定義:01union data0203int temp;04char stable10;05;上述代碼定義了一個(gè)名為data的共用體類型,它含有兩個(gè)成員,一個(gè)為整型,成員名為temp;另一個(gè)為字符數(shù)組,數(shù)組名為stable。和結(jié)構(gòu)體類似,共用體定義之后,就可以定義該類型的共用體變量。 10.6.2 共用體變量的定義與應(yīng)用 共用體變量的定義和結(jié)構(gòu)體類似,可
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 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ì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024年度離婚協(xié)議財(cái)產(chǎn)分割及子女撫養(yǎng)權(quán)協(xié)商書15篇
- 2024年度擔(dān)保公司業(yè)務(wù)拓展合作協(xié)議3篇
- 2024年度農(nóng)產(chǎn)品加工區(qū)域代理合作協(xié)議3篇
- 2024年度幼兒園園長(zhǎng)全面管理聘用合同范本3篇
- 2024停車場(chǎng)智能化改造與運(yùn)營(yíng)維護(hù)綜合合同3篇
- 2024醫(yī)療保健機(jī)構(gòu)內(nèi)部審計(jì)與風(fēng)險(xiǎn)管理合同3篇
- 2024年二零二四年度農(nóng)業(yè)種子安全檢測(cè)與風(fēng)險(xiǎn)評(píng)估合同3篇
- 2024年度擔(dān)保業(yè)務(wù)操作規(guī)范合同3篇
- 2024年度能源單位勞務(wù)派遣勞動(dòng)合同(含環(huán)保責(zé)任)3篇
- 2024年度特色旅游演出項(xiàng)目合作合同3篇
- 2025眼科護(hù)理工作計(jì)劃
- 校園牛奶消費(fèi)推廣方案
- 非甾體抗炎藥圍術(shù)期鎮(zhèn)痛專家共識(shí)(2024 版)解讀
- 技術(shù)服務(wù)外包勞務(wù)合同范本5篇
- 綠色財(cái)政政策
- 《內(nèi)外科疾病康復(fù)學(xué)》課程教學(xué)大綱
- 期末試卷(試題)-2024-2025學(xué)年三年級(jí)上冊(cè)數(shù)學(xué)蘇教版
- 天津市南開(kāi)區(qū)2023-2024學(xué)年四年級(jí)上學(xué)期期末英語(yǔ)試題
- 期末考試-公共財(cái)政概論-章節(jié)習(xí)題
- 上海市醫(yī)療器械經(jīng)營(yíng)質(zhì)量管理規(guī)范實(shí)施細(xì)則
- EVM500在電纜中應(yīng)用
評(píng)論
0/150
提交評(píng)論