




已閱讀5頁(yè),還剩80頁(yè)未讀, 繼續(xù)免費(fèi)閱讀
版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1,第8章 用戶自定義數(shù)據(jù)類(lèi)型,2,本章內(nèi)容,8.1 結(jié)構(gòu)類(lèi)型及其變量的定義 8.2 結(jié)構(gòu)數(shù)組 8.3 結(jié)構(gòu)和指針 8.4 聯(lián)合類(lèi)型 8.5 枚舉類(lèi)型,3,8.1.1結(jié)構(gòu)類(lèi)型的定義,一. 結(jié)構(gòu)類(lèi)型的概念 前面的我們學(xué)習(xí)了一些簡(jiǎn)單數(shù)據(jù)類(lèi)型(整型、實(shí)型、字符型)的定義和應(yīng)用,還學(xué)習(xí)了數(shù)組(一維、二維)的定義和應(yīng)用,這些數(shù)據(jù)類(lèi)型的特點(diǎn)是:當(dāng)定義某一特定數(shù)據(jù)類(lèi)型,就限定該類(lèi)型變量的存儲(chǔ)特性和取值范圍。 在日常生活中,我們常會(huì)遇到一些需要填寫(xiě)的登記表,如成績(jī)表、通訊地址、員工信息等。其數(shù)據(jù)類(lèi)型可能由性質(zhì)不同的成員組成。,4,結(jié)構(gòu)類(lèi)型的概念,上表中數(shù)據(jù)是由員工的工作證號(hào)(number)、姓名(name)、性別(sex) 、年齡(age) 、部門(mén)( department) 、工資(wage)等數(shù)據(jù)項(xiàng)組成的,邏輯上相關(guān)的數(shù)據(jù)。 在C語(yǔ)言中,將這種由多個(gè)不同類(lèi)型的數(shù)據(jù)項(xiàng)組合在一起形成的數(shù)據(jù)類(lèi)型,稱為結(jié)構(gòu)體類(lèi)型。,5,我們可以創(chuàng)建如下的結(jié)構(gòu)類(lèi)型: struct staff 其中staff由用戶命名 char number8; char name10; char sex; int age; char dep20; float wage2; ; 以上定義了一個(gè)結(jié)構(gòu)類(lèi)型struct staff(與int 同地位),它包含了number、name、sex、age、dep、wage等不同類(lèi)型的數(shù)據(jù)項(xiàng)。,結(jié)構(gòu)類(lèi)型的概念,6,1結(jié)構(gòu)體類(lèi)型說(shuō)明的一般形式 struct 標(biāo)識(shí)符 結(jié)構(gòu)成員列表; ; 說(shuō)明: (1) struct是關(guān)鍵字,聲明要定義一個(gè)結(jié)構(gòu)類(lèi)型,結(jié)構(gòu)類(lèi)型名用標(biāo)示符命名,要“見(jiàn)名知義”; (2)成員列表給出n個(gè)成員聲明,成員可以基本類(lèi)型變量、數(shù)組,也可以是另一結(jié)構(gòu)類(lèi)型變量等,對(duì)每個(gè)成員必須作類(lèi)型說(shuō)明,成員之間用分號(hào)分隔;,二. 結(jié)構(gòu)體類(lèi)型及結(jié)構(gòu)體變量,7,學(xué)生的基本信息,包括學(xué)號(hào)、姓名、性別、年齡、班級(jí)、成績(jī)等數(shù)據(jù)項(xiàng)。 這些數(shù)據(jù)項(xiàng)描述了一個(gè)學(xué)生的幾個(gè)不同側(cè)面。,獨(dú)立的變量:,struct student char no9; /學(xué)號(hào) char name20; /姓名 char sex; /性別 unsigned int age; /年齡 unsigned int classno; /班級(jí) float grade; /成績(jī) ,8,2.結(jié)構(gòu)類(lèi)型的幾點(diǎn)說(shuō)明,(1)對(duì)于結(jié)構(gòu)類(lèi)型,系統(tǒng)不會(huì)為之分配內(nèi)存。只有在定義了結(jié)構(gòu)變量后,系統(tǒng)才會(huì)分配內(nèi)存單元給變量。 (2)結(jié)構(gòu)是由若干個(gè)數(shù)據(jù)項(xiàng)組成,每個(gè)數(shù)據(jù)項(xiàng)都屬于一種已有定義的類(lèi)型。每一個(gè)結(jié)構(gòu)成員都不是獨(dú)立的,它不是一般的變量,而是跟結(jié)構(gòu)聯(lián)系在一起。,struct Student int number char name9; int age; char sex; ;,int age; char sex;,同名的age和sex均不會(huì)有命名沖突問(wèn)題,9,(3)結(jié)構(gòu)類(lèi)型可以嵌套定義。所謂嵌套定義是指在一個(gè)結(jié)構(gòu)類(lèi)型中可以包含另一個(gè)或一些結(jié)構(gòu)類(lèi)型,通常用于結(jié)構(gòu)類(lèi)型的成員是一個(gè)結(jié)構(gòu)變量的場(chǎng)合。,結(jié)構(gòu)類(lèi)型的幾點(diǎn)說(shuō)明,10,結(jié)構(gòu)類(lèi)型的幾點(diǎn)說(shuō)明,struct Student char name9; struct Birthday int year; int month; int day; birthday; char sex; ;,struct Student int number char name9; int age; char sex; ;,11,(4)允許省略結(jié)構(gòu)類(lèi)型名,即允許定義無(wú)類(lèi)型名的結(jié)構(gòu)類(lèi)型。,struct int year; int month; int day; birthday;,無(wú)名的結(jié)構(gòu)類(lèi)型必須后隨結(jié)構(gòu)變量(如birthday)的定義,并且僅能一處使用,這種形式通常用于內(nèi)嵌在結(jié)構(gòu)類(lèi)型中的結(jié)構(gòu)類(lèi)型。,(5)可以用sizeof運(yùn)算符來(lái)計(jì)算結(jié)構(gòu)類(lèi)型的長(zhǎng)度(字節(jié)數(shù)) 例如:printf(“%d”,sizeof(struct Student); 結(jié)果為18,結(jié)構(gòu)類(lèi)型的幾點(diǎn)說(shuō)明,12,1.結(jié)構(gòu)類(lèi)型數(shù)據(jù)對(duì)象包括一般變量、指針、數(shù)組等,對(duì)于成為結(jié)構(gòu)變量、結(jié)構(gòu)指針、結(jié)構(gòu)數(shù)組等可以在說(shuō)明語(yǔ)句中用已定義的結(jié)構(gòu)類(lèi)型定義結(jié)構(gòu)數(shù)據(jù)對(duì)象,也可以在定義結(jié)構(gòu)類(lèi)型的同時(shí)定義結(jié)構(gòu)數(shù)據(jù)對(duì)象。,8.1.2結(jié)構(gòu)類(lèi)型數(shù)據(jù)對(duì)象的定義及初始化,struct date int month; int day; int year; ; ;,struct staff char number8; struct date birthday; char sex; ;,定義了結(jié)構(gòu)類(lèi)型之后, 還必須定義結(jié)構(gòu)類(lèi)型變量, 類(lèi)型與變量是不同的概念。,13,2結(jié)構(gòu)類(lèi)型變量的三種定義方式 (1) 在說(shuō)明結(jié)構(gòu)類(lèi)型的同時(shí), 也定義了結(jié)構(gòu)類(lèi)型變量 例如: struct book int num; char name60; float price; book1, books3; 在說(shuō)明結(jié)構(gòu)類(lèi)型名struct book的同時(shí),定義了結(jié)構(gòu)類(lèi)型變量book1與結(jié)構(gòu)類(lèi)型數(shù)組books, 數(shù)組books有三個(gè)元素:books0、books1、books2。,結(jié)構(gòu)類(lèi)型數(shù)據(jù)對(duì)象的定義及初始化,14,(2) 先說(shuō)明結(jié)構(gòu)類(lèi)型, 再單獨(dú)進(jìn)行變量定義 例如: struct staff char name10; char sex; float wage2; ; . struct staff worker1, worker2;,(3) 省略結(jié)構(gòu)標(biāo)識(shí)符, 直接定義變量 例如: struct /* 此處沒(méi)有標(biāo)識(shí)符*/ int month; char day; unsigned year; d5; 沒(méi)有標(biāo)識(shí)符一定要在定義結(jié)構(gòu)類(lèi)型的同時(shí)定義變量。,結(jié)構(gòu)類(lèi)型數(shù)據(jù)對(duì)象的定義及初始化,15,定義了結(jié)構(gòu)類(lèi)型: struce Student 后定義不同變量的區(qū)別: struce Student s1, s2100, *s3= (2) 結(jié)構(gòu)類(lèi)型的變量名不是地址.,結(jié)構(gòu)類(lèi)型數(shù)據(jù)對(duì)象的定義及初始化,16,3. 結(jié)構(gòu)類(lèi)型變量的初始化 可以在定義結(jié)構(gòu)類(lèi)型變量的同時(shí)對(duì)其初始化,其語(yǔ)法格式:struct 標(biāo)識(shí)符 結(jié)構(gòu)變量名=成員初始化值表,struct Student int number char name9; struct int year; int month; int day; birthday; char sex; student1=1101,”lilin”,1985,8,1,M;,17,定義了結(jié)構(gòu)數(shù)據(jù)對(duì)象,就可以訪問(wèn)其中的每一個(gè)成員。結(jié)構(gòu)成員可以像基本變量那樣使用,如賦值、輸入輸出、參加表達(dá)式的計(jì)算等,這些操作統(tǒng)稱為對(duì)結(jié)構(gòu)成員的訪問(wèn)。 1、結(jié)構(gòu)成員的表示 結(jié)構(gòu)變量是由n個(gè)成員聚合而成的一個(gè)整體,要訪問(wèn)其中的一個(gè)成員,必須同時(shí)給出整體的名稱和個(gè)體成員的名稱。 struct Student s1,s2100,*s3= s1是結(jié)構(gòu)變量,用來(lái)存放單個(gè)學(xué)生的信息 s2是結(jié)構(gòu)數(shù)組,該數(shù)組包含100個(gè)類(lèi)型是struct Student 的成員,這樣的數(shù)組可以表示一個(gè)學(xué)生情況 s3是結(jié)構(gòu)指針,存放struct Student 類(lèi)型數(shù)據(jù)對(duì)象s1的內(nèi)存首地址。,9.1.3結(jié)構(gòu)成員的引用,18,(1)結(jié)構(gòu)變量成員的表示: 結(jié)構(gòu)變量 . 成員名 (如 s1.number、s1.age) (2)結(jié)構(gòu)數(shù)組元素成員的表示 結(jié)構(gòu)數(shù)組名下標(biāo)表達(dá)式.成員名 表示s2的第六個(gè)元素(結(jié)構(gòu)變量)之name成員 (3)結(jié)構(gòu)指針成員的表示 結(jié)構(gòu)指針-成員名 (如 s3-sex) 或 (*結(jié)構(gòu)指針). 成員名 (如 (*s3).sex) 對(duì)于多層嵌套結(jié)構(gòu)成員, 有多個(gè)“”,從外向內(nèi)。,結(jié)構(gòu)成員的引用,19,2. 成員運(yùn)算符 兩種成員運(yùn)算符:“.”和“-” 3.嵌套結(jié)構(gòu)的結(jié)構(gòu)成員的表示 結(jié)構(gòu)成員本身又是結(jié)構(gòu)變量,稱為嵌套結(jié)構(gòu)。必須使用若干個(gè)成員運(yùn)算符來(lái)連接多個(gè)結(jié)構(gòu)變量及其對(duì)應(yīng)的分量,逐級(jí)表示到最低一級(jí)成員,該級(jí)成員是可以直接訪問(wèn)的基本數(shù)據(jù)對(duì)象。 例如:student1.birthday表示student1中的birthday;而student1.birthday.year則表示student1中的birthday的year成員 注意:只能對(duì)最內(nèi)層的成員進(jìn)行存取、運(yùn)算以及輸入、輸出等操作,結(jié)構(gòu)成員的引用,20,4.結(jié)構(gòu)變量成員的引用 結(jié)構(gòu)變量的成員可以像普通變量一樣進(jìn)行各種運(yùn)算,如賦值、輸入、輸出、計(jì)算及地址操作等,例如: student1.birthday.year+; student.number=11001; scanf(“%d”,&student1.sex) 將變量中的sex的地址作為參數(shù)傳遞給scanf函數(shù),以輸入sex的值,結(jié)構(gòu)成員的引用,21,5、結(jié)構(gòu)成員表示和引用的注意事項(xiàng) (1)如果成員是基本類(lèi)型數(shù)據(jù)則可以直接引用; (2)在絕對(duì)多數(shù)場(chǎng)合(賦值運(yùn)算除外),只能訪問(wèn)成員而不能直接訪問(wèn)結(jié)構(gòu)本身。 struct Student student1,student2 student1=student1+student1; printf(“%d,%s,%d,%cn“,student1); printf(“%d,%s,%d,%c,%fn”,student1.number,,student1.age,student1.sex); Scanf(“%d,%s,%d,%c,%f”, printf(%o,student1);輸出student1的首地址,22,(3)可以將一個(gè)結(jié)構(gòu)變量作為一個(gè)整體賦給另一個(gè)具有相同類(lèi)型的結(jié)構(gòu)變量,其作用相當(dāng)于逐個(gè)對(duì)位于賦值語(yǔ)句左部的結(jié)構(gòu)變量的每個(gè)分量賦值。如: student2=student1; 等效于: student2.number=student1.number; strcpy(,); student2.sex=student1.sex; 也可以把一個(gè)結(jié)構(gòu)變量中的內(nèi)嵌結(jié)構(gòu)類(lèi)型成員賦給另一個(gè)結(jié)構(gòu)變量的對(duì)應(yīng)得內(nèi)嵌結(jié)構(gòu)類(lèi)型成員,例如 student2.birthday1=student1.birthday1; (4)不允許將一組常量直接賦給一個(gè)結(jié)構(gòu)變量。如: student2=“l(fā)ili”,18,M,12,15,1978,010001,89; ,23,例8.3 試分析以下程序的執(zhí)行結(jié)果:,#include struct Birthday int m; int d; int y; ;,void main() struct Student student1=1001,“l(fā)ili“,18,M,12,15,1982,student2; student2=student1; printf(“student1:%ld %s %d %c %d/%d/%dn“,student1.num,, student1.age, student1.sex,student1.birthday1.m,student1.birthday1.d, student1.birthday1.y); printf(“student2:%ld %s %d %c %d/%d/%dn“,student2.num,, student2.age, student2.sex,student2.birthday1.m,student2.birthday1.d, student2.birthday1.y); ,struct Student long num; char name10; int age; char sex; struct Birthday birthday1; ;,24,補(bǔ)充例 若有以下定義,則正確的賦值語(yǔ)句為( )。 struct date2 long i; char c; two; struct date1 int cat; struct date2 three; one; (A) one.three.c=A; (B) one.two.three.c=A; (C) three.c=A; (D) one.c=A;,25,8.2結(jié)構(gòu)數(shù)組,一個(gè)結(jié)構(gòu)體變量中可以存放一組數(shù)據(jù)(如一個(gè)學(xué)生的學(xué)號(hào)、姓名、成績(jī)等數(shù)據(jù))。如果有個(gè)學(xué)生的數(shù)據(jù)需要參加運(yùn)算,顯然應(yīng)該用數(shù)組,這就是結(jié)構(gòu)體數(shù)組。結(jié)構(gòu)體數(shù)組與以前介紹過(guò)的數(shù)值型數(shù)組不同之處在于每個(gè)數(shù)組元素都是一個(gè)結(jié)構(gòu)體類(lèi)型的數(shù)據(jù),它們都分別包括各個(gè)成員(分量)項(xiàng)。,26,8.2.1結(jié)構(gòu)數(shù)組的定義及其應(yīng)用,1、結(jié)構(gòu)數(shù)組的定義 結(jié)構(gòu)數(shù)組是基類(lèi)型為結(jié)構(gòu)類(lèi)型的數(shù)組。它既有結(jié)構(gòu)變量的屬性,又有數(shù)組的屬性,這樣對(duì)于成批的結(jié)構(gòu)化數(shù)據(jù),比如學(xué)生數(shù)據(jù)或職工數(shù)據(jù),既便于表示和存儲(chǔ)又便于采用循環(huán)語(yǔ)句實(shí)現(xiàn)重復(fù)處理。 定義結(jié)構(gòu)數(shù)組的語(yǔ)法格式: struct 標(biāo)識(shí)符 數(shù)組名常量表達(dá)式; 或 struct 標(biāo)識(shí)符 成員表 數(shù)組名常量表達(dá)式;,27,結(jié)構(gòu)數(shù)組的定義及其應(yīng)用,后定義,struct child char initial; int age; int grade; struct child boy30;,同時(shí)定義,struct child char initial; int age; int grade; boy30;,直接定義,struct char initial; int age; int grade; boy30;,28,2、結(jié)構(gòu)數(shù)組的初始化 Struct Student student2=1101,”lilin”,1985,8,1,M, 1102,”wangjing”,1985,7,1,F; Struct Student student =1101,”lilin”,1985,8,1,M, 1102,”wangjing”,1985,7,1,F; 數(shù)組的下標(biāo)說(shuō)明會(huì)省略,Student0,Student1,結(jié)構(gòu)數(shù)組的定義及其應(yīng)用,29,8.2.2對(duì)結(jié)構(gòu)數(shù)組的操作,1、引用結(jié)構(gòu)數(shù)組元素 數(shù)組名下標(biāo)表達(dá)式或*(數(shù)組名+i) 如:employee2、*(employee+i) 2、引用結(jié)構(gòu)數(shù)組元素的成員 employee4.salary 注意: (1)可以像基本變量那樣使用,如賦值、輸出、計(jì)算等 scanf(“%s%c”, , employee0=employee1 ,30,對(duì)結(jié)構(gòu)數(shù)組的操作,struct child char initial; int age; int grade; ; struct child boy2= a,5,3,b,4,2;,boy1.age+;,printf(“%d”,boy1.age),31,對(duì)結(jié)構(gòu)數(shù)組的操作,例:struct student int num; char name20; char sex; int age; char addr30; a5; a0. num=060001; a1. name=“Lin Hong“;,一個(gè)結(jié)構(gòu)體數(shù)組元素相當(dāng)于一個(gè)結(jié)構(gòu)體變量,其處理方法與結(jié)構(gòu)體變量的處理方法相同,32,對(duì)結(jié)構(gòu)數(shù)組的操作,例:struct student int num; char name20; char sex; int age; char addr30; a5; gets(); scanf(“%c“,33,對(duì)結(jié)構(gòu)數(shù)組的操作,3、結(jié)構(gòu)數(shù)組應(yīng)用實(shí)例 例8.5 計(jì)算學(xué)生的平均年齡,#include struct student int number; char name20; int age; stu4=1011,“l(fā)i li“,21, 1022,“l(fā)i hong“,23, 1023,“wang ping“,22, 1024,“zhang san“,22 ; void main() int i=0; float ave,s=0; for(i=0;i4;i+) s+=stui.age; printf(“s=%fn“,s); ave=s/4; printf(“average age=%fn“,ave);,34,void main() struct Device array=A, 0, B, 0, C, 0; int i, j; char device_type; for(i=1; i=N; i+) scanf(“%c“, ,#include #define N 10 /*設(shè)備數(shù)量*/ struct Device char type; int count; ;,例8.6,35,8.3結(jié)構(gòu)和指針,結(jié)構(gòu)變量在內(nèi)存中的起始地址稱為結(jié)構(gòu)變量的指針(簡(jiǎn)稱結(jié)構(gòu)指針)。 我們可以聲明一個(gè)指針變量,用來(lái)存放該地址,那么它就指向一個(gè)結(jié)構(gòu)變量。 引入結(jié)構(gòu)指針的主要目的是實(shí)現(xiàn)結(jié)構(gòu)變量的動(dòng)態(tài)存儲(chǔ)分配以及函數(shù)之間的雙向數(shù)據(jù)傳遞。 當(dāng)然,結(jié)構(gòu)變量的成員也可以使指針,甚至可以是指向相同類(lèi)型結(jié)構(gòu)變量的指針,這是構(gòu)造鏈表的基礎(chǔ)。,36,8.3.1指向結(jié)構(gòu)變量的指針,1.定義指向結(jié)構(gòu)變量的指針 struct 結(jié)構(gòu)體名 *結(jié)構(gòu)體指針名; 例 struct child *p;,存放結(jié)構(gòu)體變量在內(nèi)存的起始地址,struct child char initial; int age; int grade; boy ; struct child *p=&boy,37,指向結(jié)構(gòu)變量的指針,2. 結(jié)構(gòu)指針的初始化 struct child char initial; int age; int grade; boy, *p1, *p2; p1 = ,38,3.通過(guò)指針來(lái)引用結(jié)構(gòu)變量成員,指向運(yùn)算符 優(yōu)先級(jí): 1 結(jié)合方向:從左向右,例 int n; int *p= n=10,struct student stu1; struct student *p= (*p).num=101,(1)(*結(jié)構(gòu)體指針).成員名 例如:(* p).num (2)結(jié)構(gòu)體指針-成員名 例如:p- num,39,例8.7,#include #include struct Student long num; char name20; int age; char sex; ; void main() struct Student student,*p; p=,printf(“nname:%snnumber:%ldnage:%dnsex:%cn“, ,student.num, student.age,student.sex); printf(“nname:%snnumber:%ldnage:%dnsex:%cn“, (*p).name,(*p).num, (*p).age,(*p).sex); printf(“nname:%snnumber:%ldnage:%dnsex:%cn“ ,p-name,p-num, p-age,p-sex);,40,8.3.2指針變量作為結(jié)構(gòu)成員,#include struct Student int number; char *name; ; void main() struct Student stu=1101,“l(fā)ili“; printf(“%sn“,);,41,指針變量作為結(jié)構(gòu)成員,#include struct Student int number; char *name; ; void main() struct Student stu; scanf(“%d“,指針變量如果沒(méi)有初始化,它的指向是不確定的,也即不可用。必須調(diào)用calloc函數(shù)為其申請(qǐng)內(nèi)存空間,42,指針變量作為結(jié)構(gòu)成員,1. 指針類(lèi)型的成員變量要賦值時(shí)需分配內(nèi)存空間 2.如果變量的空間分配通過(guò)內(nèi)存分配函數(shù)完成,最后還要釋放這塊內(nèi)存區(qū)域。 介紹三個(gè)存儲(chǔ)管理庫(kù)函數(shù),原型說(shuō)明在 “alloc.h”頭文件中,使用包含到源程序中 動(dòng)態(tài)分配存儲(chǔ)區(qū)函數(shù)malloc( ) 函數(shù)原型:void *malloc(unsigned size); 調(diào)用格式:malloc(size) 功能:在內(nèi)存分配一個(gè)size字節(jié)的存儲(chǔ)區(qū)。調(diào)用 結(jié)果為新分配的存儲(chǔ)區(qū)的首地址,是一個(gè)void 類(lèi)型指針。若分配失敗,則返回NULL(即0)。,43,指針變量作為結(jié)構(gòu)成員, 動(dòng)態(tài)分配存儲(chǔ)區(qū)函數(shù)calloc( ) 函數(shù)原型: void *calloc(unsigned int n,unsigned int size); 調(diào)用格式:calloc(n,size) 功能:在內(nèi)存分配一個(gè)n倍size字節(jié)的存儲(chǔ)區(qū)。 調(diào)用結(jié)果為新分配的存儲(chǔ)區(qū)的首地址,是一個(gè)void 類(lèi)型指針。若分配失敗,則返回NULL(即0)。,44,指針變量作為結(jié)構(gòu)成員, 釋放動(dòng)態(tài)分配存儲(chǔ)區(qū)函數(shù)free( ) 函數(shù)原型:void free(void *p);,此函數(shù)無(wú)返回值,實(shí)參必須是一個(gè)指向動(dòng)態(tài)分配存儲(chǔ)區(qū) 的指針,它可以是任何類(lèi)型的指針變量。,調(diào)用格式:free(p) 功能:釋放p所指向的動(dòng)態(tài)分配的存儲(chǔ)區(qū)。,45,8.3.3指向結(jié)構(gòu)數(shù)組的指針,可以定義一個(gè)結(jié)構(gòu)指針指向一個(gè)結(jié)構(gòu)數(shù)組,也就可以利用該指針間接訪問(wèn)結(jié)構(gòu)數(shù)組的元素。 Struct A int a; float b; arr3,*p; p=arr;,46,指向結(jié)構(gòu)數(shù)組的指針,(1)p-a; 得到p指向的結(jié)構(gòu)數(shù)組元素中的成員a的值 (2)( p+)-a; 先得到p指向的結(jié)構(gòu)數(shù)組元素中的成員a的值,然后再對(duì)p指針加1 (3)(+ p)-a; 先讓p指針加1,然后得到p指向的結(jié)構(gòu)數(shù)組元素中的成員a的值 (4)( p-a)+; 先得到p指向的結(jié)構(gòu)數(shù)組元素中的成員a的值,然后再對(duì)得到的值加1,47,例8.9,#include struct Student int num; char name20; char sex; int age; ; struct Student stu2=10101,“l(fā)i lin“,M,18, 10102,“zhang fan“,M,19; void main() struct Student *p; clrscr(); printf(“No. name sex agen“); for(p=stu;pnum,p-name, p-sex,p-age); ,48,8.3.4結(jié)構(gòu)指針作為函數(shù)參數(shù),1結(jié)構(gòu)體變量作為函數(shù)的形參的三種形式: (1)以結(jié)構(gòu)體變量的成員作為參數(shù),傳遞結(jié)構(gòu)體變量的成員的值。 (2)以結(jié)構(gòu)體變量作為參數(shù),直接傳遞結(jié)構(gòu)體變量的值。 結(jié)構(gòu)變量整體傳送,即將實(shí)參結(jié)構(gòu)體變量的各個(gè)成員的值逐個(gè)傳遞給形參結(jié)構(gòu)體變量的對(duì)應(yīng)成員。 注意,實(shí)參與形參必須是相同結(jié)構(gòu)體類(lèi)型的變量。 (3)以結(jié)構(gòu)體指針作為參數(shù),傳遞結(jié)構(gòu)體變量的地址。,49,例8.10:輸出學(xué)生的姓名與年齡,struct Student int num; char name20; int age; ; void age(struct Student *p) printf(“%sn“,p-name); printf(“%dn“, p-age); ,void main() struct Student stu3 = 101, “kiki“,23, 102, “mimi“,24, 103, “nana“, 23 ; struct Student *p; p = ,50,例: 計(jì)算三個(gè)學(xué)生的總分和平均分(利用結(jié)構(gòu)指針)。,main() struct stu char name10; float score; stu3=“Mary“, 76, “John“, 85, “Tom“, 81, *p=stu; int i; float sum=0; for (i=1; iscore; p+; printf(“%5.2f, %5.2f n“, sum, sum/3); getch(); ,51,結(jié)構(gòu)類(lèi)型的應(yīng)用,例:定義一個(gè)包括年、月、日成員的結(jié)構(gòu)類(lèi)型變量,輸入一個(gè)符合常規(guī)的日期,算出該日期是這一年中的第幾天并輸出。 【分析】這里主要存在一個(gè)閏年問(wèn)題,也就是當(dāng)該年為閏年時(shí),二月份有29天,其余為28天。判斷該年是否為閏年的條件是:年份是否能被4整除,但不能100整除;或能被400整除;當(dāng)然還要判斷輸入的日期是否有效以及各月的天數(shù)情況。,52,結(jié)構(gòu)類(lèi)型的應(yīng)用,main() struct unsigned year, month, day; x; int maxday=0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31; int i, n=0; /* n為天數(shù) */ do printf(“請(qǐng)輸入年 月 日:“); scanf(“%d%d%d“, ,53,課 堂 練 習(xí),1. 下面程序段的輸出結(jié)果為( )。 main() struct date int a; char s5; arg=27, “abcd“; arg.a-=5; strcpy(arg.s, “ABCD“); printf(“%d,%sn“, arg.a, arg.s); getch(); ,2設(shè)有如下語(yǔ)句: struct stu int num; int age; ; struct stu s3=101,18,102,21,103,19; struct stu *p=s; 下面表達(dá)式的值為21的是: (A) (p+)-age (B) (*+p). age (C) (*p+). age (D) *(+p)- age,54,課 堂 練 習(xí),3若定義如下結(jié)構(gòu),則能打印出字母M的語(yǔ)句是( )。 struct person char name9; int age; ; struct person class10=“Wujun“, 20, “Liudan“, 23, “Maling“, 21, “zhangming“, 22; (A) printf(“%cn“, ); (B) printf(“%cn“, 0); (C) printf(“%cn“, 1); (D) printf(“%cn“, 1);,55,8.4.1聯(lián)合的概念及聯(lián)合類(lèi)型定義,1聯(lián)合類(lèi)型的概念: 將若干個(gè)變量組織在一起,使它們能在不同的時(shí)間占用同一段內(nèi)存空間,這種數(shù)據(jù)組合對(duì)應(yīng)得數(shù)據(jù)類(lèi)型稱為聯(lián)合類(lèi)型或共同體類(lèi)型。 2.定義聯(lián)合類(lèi)型 union 聯(lián)合類(lèi)型名 (union是C語(yǔ)言關(guān)鍵字) 成員列表; ;,56,例如: union abc (union是C語(yǔ)言關(guān)鍵字) char ch; int i; float f; v; 以上說(shuō)明了一個(gè)聯(lián)合類(lèi)型: union abc, 同時(shí)定義一個(gè)聯(lián)合類(lèi)型變量v。 內(nèi)存高地址 內(nèi)存低地址,聯(lián)合的概念及聯(lián)合類(lèi)型定義,57,構(gòu)造數(shù)據(jù)類(lèi)型,也叫共用體 用途:使幾個(gè)不同類(lèi)型的變量共占1段內(nèi)存(相互覆蓋),union 聯(lián)合體類(lèi)型名 數(shù)據(jù)類(lèi)型名1 成員名1; 數(shù)據(jù)類(lèi)型名2 成員名2; ;,類(lèi)型定義不分配內(nèi)存,聯(lián)合體的大小是成員中占內(nèi)存最大的成員的大小 共占4字節(jié),最新存儲(chǔ)的數(shù)據(jù)是有效的,聯(lián)合的概念及聯(lián)合類(lèi)型定義,58,說(shuō)明: (1) 系統(tǒng)為所有聯(lián)合類(lèi)型成員分配同一地址開(kāi)始的存儲(chǔ)空間, 使用覆蓋的方式共享存儲(chǔ)單元。 例:用數(shù)組作聯(lián)合類(lèi)型的成員 union utp1 unsigned char b2; unsigned w; r1; 本例聯(lián)合類(lèi)型中, 定義了一個(gè)數(shù)組成員b??梢杂胷1.b0存取r1.w低字節(jié)的值, 用r1.b1存取r1.w高字節(jié)的值。例如下列程序段: r1.w = 0x6141; printf(“%c, %c, %un“, r1.b0, r1.b1, r1.w); 輸出結(jié)果是:A, a, 24897,聯(lián)合的概念及聯(lián)合類(lèi)型定義,59,(2) 聯(lián)合類(lèi)型也允許嵌套定義,例如: union utp struct char low, high; b; unsigned w; r ; 以上在聯(lián)合類(lèi)型中, 定義了一個(gè)結(jié)構(gòu)類(lèi)型成員b, 如上圖所示。本例中可以用r.b.low存取r.w的低字節(jié)的值,而用r.b.high存取r.w的高字節(jié)的值, 也可以用r.w一次存取雙字節(jié)的值。,聯(lián)合的概念及聯(lián)合類(lèi)型定義,60,(3) 聯(lián)合類(lèi)型變量所占空間的大小取決于占存儲(chǔ)空間最大的那個(gè)成員。例如上述例子中(圖4.13所示), sizeof(u_type)或sizeof(v)的值均為, 因?yàn)槌蓡Tch、i、f中, f占個(gè)字節(jié)的存儲(chǔ)空間, 是占空間最大的。 (4) 由于聯(lián)合類(lèi)型變量中所有成員共享存儲(chǔ)空間, 因此變量中的所有成員的首地址相同, 而且聯(lián)合類(lèi)型變量的地址也就是該變量成員的地址。&r, &r.w, &r.b.low的值均相同。,聯(lián)合的概念及聯(lián)合類(lèi)型定義,61,練習(xí):如果有定義: union xy char ch; int a3; float b; ); 共用體類(lèi)型union xy的存儲(chǔ)單元中各成員占用空間情況如圖: 則共用體類(lèi)型union xy的長(zhǎng)度是6(占用內(nèi)存的字節(jié)數(shù))。,聯(lián)合的概念及聯(lián)合類(lèi)型定義,62,8.4.2聯(lián)合變量的定義及成員的引用,1.定義聯(lián)合變量,共用體變量的定義有如下三種處理方式: (1)先定義共用體類(lèi)型,再定義共用體變量。 例1:union xy char ch; int a3; float b; ; /*定義共用體類(lèi)型union xy */ union xy x,y; /*定義x、y為共用體類(lèi)型union xy的變量*/,63,聯(lián)合變量的定義及成員的引用,(2)在定義共用體類(lèi)型的同時(shí)定義共用體變量。 例2:union xy char ch; int a3; float b; x,y; (3)直接定義共用類(lèi)型變量。 例3:union char ch; int a3; float b; x,y;,64,聯(lián)合體與結(jié)構(gòu)體的異同,聯(lián)合體與結(jié)構(gòu)體都是由多個(gè)成員分量組成的一個(gè)整體; 聯(lián)合體與結(jié)構(gòu)體在定義、說(shuō)明和使用(成員引用、指針)上十分相似。 結(jié)構(gòu)體:多個(gè)成員分量分別占用不同的存儲(chǔ)空間構(gòu)成一個(gè)整體;成員分量之間是相互獨(dú)立的,所進(jìn)行的各種操作互不影響。 聯(lián)合體:多個(gè)成員分量共同占用同一存儲(chǔ)空間;成員分量之間是相互聯(lián)系的,所進(jìn)行的操作相互依賴。,65,聯(lián)合體與結(jié)構(gòu)體的異同,注意:聯(lián)合在一個(gè)時(shí)間里不能三個(gè)成員同時(shí)起作用,而只能有一個(gè)成員在起作用,而且是最后被賦值的成員;而結(jié)構(gòu)在任何一個(gè)時(shí)間都是三個(gè)成員同時(shí)在起作用。 聯(lián)合變量的長(zhǎng)度等于類(lèi)型最長(zhǎng)的成員的長(zhǎng)度,而結(jié)果變量的長(zhǎng)度等于所有成員長(zhǎng)度之和。 可以在定義結(jié)構(gòu)變量時(shí)對(duì)每個(gè)成員初始化,而不能在定義聯(lián)合變量時(shí)進(jìn)行初始化。,66,聯(lián)合體與結(jié)構(gòu)體的異同,特別注意: 聯(lián)合類(lèi)型變量在定義的同時(shí)只能對(duì)第一個(gè)成員的值進(jìn)行初始化。(因?yàn)槠渌蓡T的賦初值會(huì)改變第一個(gè)成員的值) 例如: union utype int i; char j; x=65; 以上在定義聯(lián)合類(lèi)型變量給 x.i 賦初值65, x.j 賦初值A(chǔ) 。,67,2.聯(lián)合成員的引用 與結(jié)構(gòu)變量一樣,對(duì)聯(lián)合變量只能在成員級(jí)別上進(jìn)行操作(稱為聯(lián)合成員的引用),不能直接操作聯(lián)合變量。聯(lián)合成員也可以通過(guò)定義指向聯(lián)合的指針來(lái)引用。,union data int a; float b; char c; data1, *p=,要引用其中的成員b, 可用以下三種格式: data1.b p-b (*p).b,聯(lián)合類(lèi)型某一成員賦值, 會(huì)覆蓋其它成員原來(lái)的數(shù)據(jù), 原來(lái)成員的值就亂了,因此, 多次賦值, 起作用的可能是最后一次存入的成員的值。,68,例:假設(shè)有一個(gè)unsigned long 類(lèi)型整數(shù),分別將其前2個(gè)字節(jié)和后2個(gè)字節(jié)作為兩個(gè)unsigned int類(lèi)型輸出。 main() union unsigned long k; unsigned a2; x; x.k=0x2e314fdd; printf(“%x, %xn“, x.a0, x.a1); getch(); ,聯(lián)合成員的引用,69,8.5枚舉類(lèi)型,實(shí)際應(yīng)用中,某些變量只有幾種可能的值, 例如在模擬撲克牌的游戲中, 撲克牌只有四種花色(梅花、方塊、紅桃、黑桃), 可以把這種變量定義成枚舉類(lèi)型。 所謂枚舉,是將具有相同屬性的一類(lèi)數(shù)據(jù)值一一列舉。例如:表示星期的Sunday,Monday,Tuesday,Wednesday,Thursday,F(xiàn)riday,Saturday就是一個(gè)枚舉。 枚舉是一個(gè)具有有限個(gè)整型符號(hào)常量的集合,這些整型符號(hào)常量稱為枚舉常量。 枚舉類(lèi)型就是將變量的可取值一一列舉出來(lái), 變量只能取其中之一的值.,70,8.5.1 枚舉類(lèi)型的定義,enum weekday Sun, Mon, Tue, Wed, Thu, Fri, Sat ; enum color1 blue, green, red ; enum flag false, true ;,enum是關(guān)鍵字; 枚舉名和枚舉常量是標(biāo)識(shí)符; 枚舉常量之間用逗號(hào)分隔。,1. 枚舉類(lèi)型的定義 enum 枚舉名 標(biāo)識(shí)符1=整型常數(shù), 標(biāo)識(shí)符2=整型常數(shù), ;,71,枚舉類(lèi)型,例如: enum cards club, diamond, heart, spade card1, card2; 定義了一個(gè)枚舉類(lèi)型enum cards的同時(shí)定義了二個(gè)該類(lèi)型的枚舉型變量card1與card2,它們的值只能是club, diamond, heart, spade之一。 例如: card1 = club; card2 = spade; 是合法的賦值語(yǔ)句。,72,說(shuō)明: (1)enum是C語(yǔ)言的關(guān)鍵字, 用于說(shuō)明枚舉類(lèi)型以及定義枚舉變量。再看幾個(gè)定義: enum weekday Mon, Tue, Wed, Thu, Fri, Sat, Sun; /*說(shuō)明枚舉類(lèi)型*/ enum colors red, green, bluebackcolor, forecolor; /*說(shuō)明枚舉類(lèi)型的同時(shí)定義枚舉型變量*/ enum weekday workday, week_end; /*用已定義好的枚舉類(lèi)型定義枚舉變量*/,說(shuō)明:,73,枚舉類(lèi)型,(2)枚舉類(lèi)型的說(shuō)明和變量定義有兩種方式(如上), 第一種方式把定義和說(shuō)明分開(kāi); 第二種方式在說(shuō)明枚舉類(lèi)型的同時(shí)定義枚舉變量。 (3)枚舉類(lèi)型名和枚舉值均為用戶定義的標(biāo)識(shí)符(不能是雙引號(hào)括起來(lái)的字符串或數(shù)值)。枚舉值又稱為枚舉元素、枚舉常量, 系統(tǒng)將枚舉值作為整型常量來(lái)處理。因?yàn)槭浅A? 因此不能在程序執(zhí)行時(shí)被賦值, 也不能與其它標(biāo)識(shí)符同名。 枚舉值是常量,不是變量。若定義了上述幾種枚舉類(lèi)型, 以下語(yǔ)句是非法的: int red; 或 Mon=1;,74,枚舉類(lèi)型,(4)如果省略”=整型常量”, 編譯程序按順序給每個(gè)枚舉元素一個(gè)對(duì)應(yīng)的整數(shù)值, 整數(shù)值從0開(kāi)始, 后續(xù)元素順序加1。例如上面的例子中, Mon的值為,Tue的值為1, ., Sun的值為6。 可以在定義時(shí)指定枚舉元素對(duì)應(yīng)的整數(shù)值, 沒(méi)有指定整數(shù)值的元素則在前一元素序號(hào)值的基礎(chǔ)上順序加1。 例如: enum weekdaySun=7,Mon=1, Tue, Wed, Thu, Fri, Sat; 此時(shí)Sun的值為7, Mon的值為1, Tue的值為2 , ., Sat的值為6。,75,枚舉類(lèi)型,也可以指定枚舉元素對(duì)應(yīng)的值是負(fù)整數(shù), 以后的枚舉元素值仍依次加1。例如: enum operator plus, minus= -3, times, divide; 則plus的值為0, minus的值為-3, times的值為-2 , divide的值為-1。 (5)每個(gè)枚舉元素之間用逗號(hào)”,”隔開(kāi), 而不是用分號(hào)”;”隔開(kāi)。 (6)用printf函數(shù)輸出用%d, 而不能用%s,76,枚舉類(lèi)型,(7)枚舉變量只能取枚舉類(lèi)型說(shuō)明結(jié)構(gòu)中的某個(gè)枚舉元素, 若要對(duì)枚舉變量賦整數(shù)值必須進(jìn)行強(qiáng)制類(lèi)型轉(zhuǎn)換。例如: enum weekday Sun=7, Mon=1, Tue, Wed, Thu, Fri, Sat workday, week_end; workday=Mon; week_end=(enum weekday) (6); /* 相當(dāng)于week_end=Sat;*/ (8) 枚舉變量可以進(jìn)行加(減)一個(gè)整數(shù)n的運(yùn)算。例如: workday=Mon; workday +; /*此時(shí)workday的值變成Tue*/,77,枚舉類(lèi)型,void main() enum weekday sun, mon, tue, wed, thu, fri, sat a,b,c; a=sun; b=mon; c=tue; printf(“%d,%d,%d“, a, b, c); 運(yùn)行結(jié)果如下: 0,1,2,枚舉變量取枚舉說(shuō)明結(jié)構(gòu)中的某個(gè)標(biāo)識(shí)符常量后,其值可認(rèn)為是標(biāo)識(shí)符對(duì)應(yīng)的常數(shù),78,用 typedef 定義類(lèi)型別名,C語(yǔ)言中, 可以使用關(guān)鍵字”typedef”對(duì)已有的類(lèi)型說(shuō)明一個(gè)新名稱。格式為: typedef 類(lèi)型名 類(lèi)型別名; 上述只說(shuō)明了一個(gè)數(shù)據(jù)類(lèi)型的新名字, 而不是產(chǎn)生了一種新的數(shù)據(jù)類(lèi)型, 原有類(lèi)型名依然有效。例如: typedef float REAL; 使用上述說(shuō)明后, REAL就成了float的代名詞。此后,可用標(biāo)識(shí)符REAL來(lái)定義單精度實(shí)型變量。例如: REAL x, y; /* 等價(jià)于 float x, y; */,79,typedef 的用途,習(xí)慣上將新的類(lèi)型名用大寫(xiě)字母表示, 以便與系統(tǒng)提
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年農(nóng)業(yè)綠色發(fā)展政策支持與綠色農(nóng)產(chǎn)品品牌建設(shè)技術(shù)應(yīng)用報(bào)告
- 2025年農(nóng)業(yè)綠色發(fā)展報(bào)告:政策導(dǎo)向與農(nóng)業(yè)綠色生產(chǎn)技術(shù)應(yīng)用創(chuàng)新研究
- 學(xué)校調(diào)音室管理制度
- 學(xué)生免學(xué)費(fèi)管理制度
- 學(xué)生餐配送管理制度
- 安全與應(yīng)急管理制度
- 安全警戒帶管理制度
- 宗親會(huì)財(cái)務(wù)管理制度
- 宜賓公積金管理制度
- 實(shí)驗(yàn)室工作管理制度
- 科室vte管理制度
- 中小學(xué)美術(shù)教學(xué)評(píng)價(jià)構(gòu)建及實(shí)施策略
- 江蘇省揚(yáng)州市2024-2025學(xué)年四年級(jí)下學(xué)期6月數(shù)學(xué)期末試題一(有答案)
- 2024年西南醫(yī)科大學(xué)招聘專(zhuān)職輔導(dǎo)員真題
- 建設(shè)工程動(dòng)火管理制度
- 保育師操作考試題及答案
- 天津市部分區(qū)2025年九年級(jí)下學(xué)期中考二模數(shù)學(xué)試卷(含詳解)
- 廣東省珠海市文園中學(xué)2025屆七下數(shù)學(xué)期末質(zhì)量跟蹤監(jiān)視試題含解析
- 2024 - 2025學(xué)年人教版三年級(jí)下冊(cè)美術(shù)期末考試試卷及參考答案
- 《肺結(jié)核的診斷與治療》課件
- 礦泉水配送合同協(xié)議
評(píng)論
0/150
提交評(píng)論