版權(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 廣東體育職業(yè)技術(shù)學(xué)院《電工電子技術(shù)B》2023-2024學(xué)年第一學(xué)期期末試卷
- 廣東外語外貿(mào)大學(xué)南國商學(xué)院《無線傳感器網(wǎng)絡(luò)技術(shù)》2023-2024學(xué)年第一學(xué)期期末試卷
- 廣東生態(tài)工程職業(yè)學(xué)院《塑料成型工藝與模具設(shè)計》2023-2024學(xué)年第一學(xué)期期末試卷
- 廣東女子職業(yè)技術(shù)學(xué)院《交互設(shè)計基礎(chǔ)》2023-2024學(xué)年第一學(xué)期期末試卷
- 【全程復(fù)習(xí)方略】2020年人教A版數(shù)學(xué)理(廣東用)課時作業(yè):第十章-第八節(jié)二項分布、正態(tài)分布及其應(yīng)用
- 【2021屆備考】2020全國名?;瘜W(xué)試題分類解析匯編(第三期):E單元-物質(zhì)結(jié)構(gòu)-元素周期律
- 【全程復(fù)習(xí)方略】2020年北師版數(shù)學(xué)文(陜西用)課時作業(yè):第六章-第一節(jié)不等關(guān)系與不等式
- 《典型冗余分析圖》課件
- 2025年人教版七年級數(shù)學(xué)寒假預(yù)習(xí) 第01講 相交線
- 2025年人教版七年級數(shù)學(xué)寒假復(fù)習(xí) 專題03 代數(shù)式(3重點串講+10考點提升+過關(guān)檢測)
- 2022-2023學(xué)年廣東省廣州市花都區(qū)六年級(上)期末英語試卷(含答案)
- 機械設(shè)計制造及其自動化實習(xí)總結(jié)報告
- 2024年湖南省高中學(xué)業(yè)水平合格考物理試卷真題(含答案詳解)
- 機動車檢測站質(zhì)量手冊(根據(jù)補充技術(shù)要求修訂)
- 2024年(學(xué)習(xí)強國)思想政治理論知識考試題庫與答案
- 上海上海市醫(yī)療急救中心招聘筆試歷年典型考題及考點附答案解析
- 《大數(shù)據(jù)分析技術(shù)》課程標(biāo)準(zhǔn)
- 2024年河南農(nóng)業(yè)職業(yè)學(xué)院單招職業(yè)適應(yīng)性測試題庫及參考答案
- 期末考試-公共財政概論-章節(jié)習(xí)題
- AED急救知識課件
- 高中物理課件:Tracker軟件在高中物理實驗教學(xué)中的應(yīng)用-
評論
0/150
提交評論