第9章結(jié)構(gòu)體、共用體與及枚舉課件_第1頁(yè)
第9章結(jié)構(gòu)體、共用體與及枚舉課件_第2頁(yè)
第9章結(jié)構(gòu)體、共用體與及枚舉課件_第3頁(yè)
第9章結(jié)構(gòu)體、共用體與及枚舉課件_第4頁(yè)
第9章結(jié)構(gòu)體、共用體與及枚舉課件_第5頁(yè)
已閱讀5頁(yè),還剩60頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

結(jié)構(gòu)體、共用體與及枚舉

9了解結(jié)構(gòu)體、共用體和枚舉類(lèi)型的特點(diǎn)熟練掌握結(jié)構(gòu)體類(lèi)型、變量、數(shù)組、指針變量的定義、初始化和成員的引用方法掌握共用體和枚舉類(lèi)型、變量的定義和引用掌握用戶(hù)自定義類(lèi)型的定義和使用9.1結(jié)構(gòu)體【問(wèn)題】如何表示下面的數(shù)據(jù)?王云平、18歲、男、學(xué)號(hào)2019010001、漢族、北京、手機(jī)/p>

可以定義以下變量來(lái)分別表示上面的數(shù)據(jù):charname[10];intage;charsex[3];charxh[11];charnation[20];charaddress[20];charmobile[20];

由于必須類(lèi)型相同才能構(gòu)造成數(shù)組,顯然以前學(xué)習(xí)的數(shù)據(jù)類(lèi)型都不能很好地解決問(wèn)題9.1.1結(jié)構(gòu)體類(lèi)型的定義結(jié)構(gòu)體類(lèi)型的定義形式為:struct

類(lèi)型名{成員說(shuō)明表列};例如:struct

student /*結(jié)構(gòu)體類(lèi)型名*/{charname[10];/*結(jié)構(gòu)體成員,以下都是*/intage;charsex[3];charxh[11];charnation[20];charaddress[20];chartel[20];};9.1.1結(jié)構(gòu)體類(lèi)型的定義struct是結(jié)構(gòu)體關(guān)鍵字,結(jié)構(gòu)體類(lèi)型定義中的每個(gè)成員項(xiàng)都有確定的類(lèi)型和名稱(chēng),稱(chēng)為結(jié)構(gòu)體類(lèi)型的“域”,每個(gè)域的定義后面要有“;”號(hào)。結(jié)構(gòu)體類(lèi)型由用戶(hù)定義,所以結(jié)構(gòu)體類(lèi)型不是固定結(jié)構(gòu)的類(lèi)型,用戶(hù)可以定義不同結(jié)構(gòu)的結(jié)構(gòu)體類(lèi)型,也可以定義相同結(jié)構(gòu)的結(jié)構(gòu)體類(lèi)型,系統(tǒng)均認(rèn)為是不同的結(jié)構(gòu)體類(lèi)型,例如下面是兩個(gè)不同的結(jié)構(gòu)體類(lèi)型,雖然aa和bb的結(jié)構(gòu)是一樣的:structaa{inta;intb;charc;}structbb{inta;intb;charc;}9.1.2結(jié)構(gòu)體變量的定義和初始化定義結(jié)構(gòu)體變量的方法可以如下:用已定義的結(jié)構(gòu)體類(lèi)型名定義變量。例如:structstudentwang,zhang;在定義結(jié)構(gòu)體類(lèi)型的同時(shí)定義結(jié)構(gòu)體變量。例如:structstudent /*結(jié)構(gòu)體類(lèi)型名*/{charname[10];/*結(jié)構(gòu)體成員,以下都是*/intage;charsex[3];charxh[11];charnation[20];charaddress[20];chartel[20];}wang,zhang;9.1.2結(jié)構(gòu)體變量的定義和初始化不定義結(jié)構(gòu)體類(lèi)型名,直接定義結(jié)構(gòu)體變量。例如:struct{charname[10];intage;charsex[3];charxh[11];charnation[20];charaddress[20];chartel[20];}wang,zhang;結(jié)構(gòu)體類(lèi)型的長(zhǎng)度

結(jié)構(gòu)體類(lèi)型的長(zhǎng)度可以用sizeof運(yùn)算符計(jì)算出來(lái),形式為:sizeof(結(jié)構(gòu)體類(lèi)型名)或者sizeof(變量名)如sizeof(structstudent)或sizeof(wang),在TC和VC下,結(jié)果分別是:86和88。結(jié)構(gòu)體類(lèi)型的嵌套structdate{intyear;intmonth;intday;};structstudent{charname[10];intage;charsex[3];charxh[11];

structdatebirthday;charnation[20];charaddress[20];chartel[20];}wang,zhang;

structstudent{charname[10];intage;charsex[2];charxh[11];struct{intyear;intmonth;intday;}birthday;charnation[20];charaddress[20];chartel[20];}wang,zhang;結(jié)構(gòu)體類(lèi)型變量的初始化定義的同時(shí)初始化structstudentwang={"王云平",18,"男","2019010001","漢族","北京",},zhang={"張麗",18,"男","2019010002","漢族","廣州",};注意初始化的數(shù)據(jù)及其類(lèi)型要與各個(gè)成員一一對(duì)應(yīng),對(duì)于包含嵌套結(jié)構(gòu)體類(lèi)型的變量,其嵌套部分的初始化也按順序賦初值structstudentwang={"王云平",18,"男","2019010001",2019,3,3,"漢族","北京",};9.1.3結(jié)構(gòu)體變量的引用數(shù)組元素的引用采用數(shù)組名和下標(biāo)結(jié)合的引用方法,例如a[2]、b[5]等。結(jié)構(gòu)體變量其成員的引用則采用成員運(yùn)算符“.”來(lái)完成,格式為:結(jié)構(gòu)體變量名.成員名或結(jié)構(gòu)體變量名.結(jié)構(gòu)體成員名.….結(jié)構(gòu)體成員名.基本成員名后者是指包含嵌套的結(jié)構(gòu)體類(lèi)型。例如前面定義的變量wang,其成員引用如下:wang.agewang.birthday.year注意結(jié)構(gòu)體的成員引用的形式比普通的變量(或數(shù)組)復(fù)雜一些,但本質(zhì)上相當(dāng)于一個(gè)普通變量(或數(shù)組),可參與該成員所屬數(shù)據(jù)類(lèi)型的一切運(yùn)算。例如:wang.age=20;iage=20;printf("age=%d\n",wang.age);printf("age=%d\n",iage+wang.age);…成員運(yùn)算符“.”的優(yōu)先級(jí)最高,在表達(dá)式中的結(jié)構(gòu)體變量成員不需要加括號(hào)。例如:wang.age++;相當(dāng)于(wang.age)++;注意結(jié)構(gòu)體變量的成員名可以相同,但必須處在不同的層次。例如:sturctstudent{intno;charname[20];struct{intno;charclassname[20];}class;struct{intno;chargroupname[20];}group;}wang;上面的結(jié)構(gòu)體存在幾個(gè)相同的成員no,但層次不同,其引用形式能夠區(qū)別開(kāi)來(lái),引用形式分別如下:wang.nowang.class.nowang.group.no注意同一類(lèi)型的結(jié)構(gòu)體變量可相互賦值。我們知道,數(shù)組之間不能整體賦值,但同類(lèi)型的兩個(gè)結(jié)構(gòu)體變量之間可以整體賦值,這樣可以提高程序的效率。例如:zhang=wang;zhang.birthday=wang.birthday;【例9-1】演示結(jié)構(gòu)體類(lèi)型。#include<stdio.h>#include<string.h>structdate{ intyear; intmonth; intday;};structstudent{ charname[10]; intage; charsex[3]; charxh[11]; structdatebirthday; charnation[20]; charaddress[20]; chartel[20];};【例9-1】演示結(jié)構(gòu)體類(lèi)型。main(){ structstudentwang={"WangYunPing",18,"M","2019010001", 2019,3,3,"Han","BeiJing", },zhang; zhang=wang; strcpy(,"ZhangLi");strcpy(zhang.xh,"2019010002"); zhang.birthday.year=2019; zhang.birthday.month=4; zhang.birthday.day=4; strcpy(zhang.address,"GuangZhou"); strcpy(zhang.tel,); printf("%s,%d,%s,%s,",,zhang.age,zhang.sex,zhang.xh);printf("%d,%d,%d,",zhang.birthday.year,zhang.birthday.month, zhang.birthday.day); printf("%s,%s,%s\n",zhang.nation,zhang.address,zhang.tel);}9.1.4結(jié)構(gòu)體數(shù)組結(jié)構(gòu)體類(lèi)型既可以定義單個(gè)的變量,也可以定義結(jié)構(gòu)體數(shù)組,用以存儲(chǔ)批量的數(shù)據(jù)。結(jié)構(gòu)體數(shù)組的定義和結(jié)構(gòu)體變量定義一樣,結(jié)構(gòu)體數(shù)組的定義也有以下3種方法:先定義結(jié)構(gòu)體類(lèi)型,用結(jié)構(gòu)體類(lèi)型名定義結(jié)構(gòu)體數(shù)組,例如:structstudent{…};structstudentstud[50];定義結(jié)構(gòu)體類(lèi)型名的同時(shí)定義結(jié)構(gòu)體數(shù)組,例如:structstudent{…}stud[50];不定義結(jié)構(gòu)體類(lèi)型名,直接定義結(jié)構(gòu)體數(shù)組,例如:struct{…}stud[50];結(jié)構(gòu)體數(shù)組的初始化和普通數(shù)組的元素是普通變量一樣,結(jié)構(gòu)體數(shù)組的每一個(gè)元素相當(dāng)于一個(gè)結(jié)構(gòu)體變量,二者的初始化也很類(lèi)似,例如:structstudentstud[2]={{"王云平",18,"男","2019010001","漢族","北京",},{"張麗",18,"男","2019010003","漢族","廣州",}};結(jié)構(gòu)體數(shù)組的引用結(jié)構(gòu)體數(shù)組元素的成員表示為:結(jié)構(gòu)體數(shù)組名[下標(biāo)].成員名或結(jié)構(gòu)體數(shù)組名[下標(biāo)].結(jié)構(gòu)體成員名.….結(jié)構(gòu)體成員名.成員名例如:stud[i].agestud[5].birthday.year結(jié)構(gòu)體數(shù)組元素和類(lèi)型相同的結(jié)構(gòu)體變量一樣,可相互賦值。例如:stud[1]=stud[0];對(duì)于結(jié)構(gòu)體數(shù)組元素內(nèi)嵌的結(jié)構(gòu)體類(lèi)型成員,情況也相同。例如:student[2].birthday=student[1].birthday;【例9-2】演示結(jié)構(gòu)體數(shù)組的定義和應(yīng)用。

#include<stdio.h>#include<string.h>structdate{ intyear; intmonth; intday;};structstudent{ charname[20]; intage; charsex[3]; charxh[11]; structdatebirthday; charnation[20]; charaddress[20]; chartel[20];};【例9-2】演示結(jié)構(gòu)體數(shù)組的定義和應(yīng)用。main(){ structstudentstud[3]={ {"WangYunPing",18,"M","2019010001",2019,3,3,"Han","BeiJing",}, {"ZhangLi",18,"M","2019010002",2019,4,4,"Han","GuangZhou",}, {"GuYuPing",18,"F","2019010003",2019,5,5,"Han","ShangHai",}}; inti; for(i=0;i<3;i++) { printf("%s,%d,%s,%s,",stud[i].name,stud[i].age,stud[i].sex,stud[i].xh); printf("%d,%d,%d,",stud[i].birthday.year,stud[i].birthday.month,stud[i].birthday.day); printf("%s,%s,%s\n",stud[i].nation,stud[i].address,stud[i].tel); }}【例9-2】用鍵盤(pán)輸入數(shù)據(jù),程序修改為 …… structstudentstud[3]; inti; for(i=0;i<3;i++) { printf("InputNo:%d\n",i+1); printf("Name:");gets(stud[i].name); printf("Age:");scanf("%d",&stud[i].age); getchar(); printf("Sex:");gets(stud[i].sex); printf("XH:");gets(stud[i].xh); printf("Birthdat(YY,MM,DD):"); scanf("%d,%d,%d",&stud[i].birthday.year,&stud[i].birthday. month,&stud[i].birthday.day); getchar(); printf("Nation:");gets(stud[i].nation); printf("Address:");gets(stud[i].address); printf("Tel:");gets(stud[i].tel); } ……【例9-2】用鍵盤(pán)輸入數(shù)據(jù)輸入界面:9.1.5結(jié)構(gòu)體指針可以定義結(jié)構(gòu)體類(lèi)型的指針變量來(lái)訪(fǎng)問(wèn)結(jié)構(gòu)體變量或結(jié)構(gòu)體數(shù)組。例如:structstudent{ charname[20]; intage; charsex[3]; charxh[11]; structdatebirthday; charnation[20]; charaddress[20]; chartel[20];}wang,*p=&wang;p是指向結(jié)構(gòu)體變量wang的指針變量,準(zhǔn)確地說(shuō)是指向該變量對(duì)應(yīng)的結(jié)構(gòu)體數(shù)據(jù)區(qū)域的首地址。9.1.5結(jié)構(gòu)體指針利用結(jié)構(gòu)體指針變量同樣可以訪(fǎng)問(wèn)其成員,訪(fǎng)問(wèn)的形式如下:(*p).age或p->age因?yàn)?p其實(shí)相當(dāng)于wang,所以(*p).age相當(dāng)于wang.age。“->”是一個(gè)運(yùn)算符,和“.”優(yōu)先級(jí)相同,具有最高的優(yōu)先級(jí),用于成員的引用?!纠?-3】修改例9-2,利用結(jié)構(gòu)體指針變量訪(fǎng)問(wèn)數(shù)據(jù)。 …… structstudent*p; inti; p=&wang; printf("%s,%d,%s,%s,",p->name,p->age,p->sex,p->xh); printf("%d,%d,%d,",p->birthday.year,p->birthday.month,p->birthday.day); printf("%s,%s,%s\n",p->nation,p->address,p->tel); p=&stud[0]; for(i=0;i<3;i++) { printf("%s,%d,%s,%s,",p->name,p->age,p->sex,p->xh); printf("%d,%d,%d,",p->birthday.year,p->birthday.month,p->birthday.day); printf("%s,%s,%s\n",p->nation,p->address,p->tel); p++; } ……【例9-3】修改例9-2,利用結(jié)構(gòu)體指針變量訪(fǎng)問(wèn)數(shù)據(jù)。第1行的輸出是p指向結(jié)構(gòu)體變量wang后輸出的。這樣的訪(fǎng)問(wèn)方式和結(jié)構(gòu)體變量訪(fǎng)問(wèn)方式差不多。第2行至第4行是p指向結(jié)構(gòu)體數(shù)組后輸出的。當(dāng)p指向&stud[0],即第一個(gè)結(jié)構(gòu)體數(shù)組元素時(shí),輸出第一個(gè)元素的所有成員;p++表示結(jié)構(gòu)體類(lèi)型指針變量移動(dòng)一個(gè)結(jié)構(gòu)體類(lèi)型單位,指向下一個(gè)結(jié)構(gòu)體數(shù)組元素stud[1]。9.1.6結(jié)構(gòu)體與函數(shù)結(jié)構(gòu)體類(lèi)型和函數(shù)的關(guān)系表現(xiàn)在:結(jié)構(gòu)體變量成員作為函數(shù)的參數(shù)。結(jié)構(gòu)體變量作為函數(shù)的參數(shù)。結(jié)構(gòu)體指針作為函數(shù)的參數(shù)?!纠?-4】打印學(xué)號(hào)為20190102學(xué)生的年齡。

#include<stdio.h>#include<string.h>structdate{ intyear; intmonth; intday;};structstudent{ charname[20]; intage; charsex[3]; charxh[11]; structdatebirthday; charnation[20]; charaddress[20]; chartel[20];};【例9-4】打印學(xué)號(hào)為20190102學(xué)生的年齡。voidshowage(intage){ printf("Age:%d\n",age);}voidshow1(structstudents)/*結(jié)構(gòu)體變量作為形參*/{ printf("%s,%d,%s,%s,",,s.age,s.sex,s.xh); printf("%d,%d,%d,",s.birthday.year,s.birthday.month,s.birthday.day); printf("%s,%s,%s\n",s.nation,s.address,s.tel);}voidshow2(structstudent*p)/*結(jié)構(gòu)體指針作為形參*/{ printf("%s,%d,%s,%s,",p->name,p->age,p->sex,p->xh); printf("%d,%d,%d,",p->birthday.year,p->birthday.month,p->birthday.day); printf("%s,%s,%s\n",p->nation,p->address,p->tel);}voidshow3(structstudents[],intn)/*結(jié)構(gòu)體數(shù)組作為形參*/{ inti; for(i=0;i<n;i++) { printf("%s,%d,%s,%s,",s[i].name,s[i].age,s[i].sex,s[i].xh); printf("%d,%d,%d,",s[i].birthday.year,s[i].birthday.month, s[i].birthday.day); printf("%s,%s,%s\n",s[i].nation,s[i].address,s[i].tel);}}【例9-4】打印學(xué)號(hào)為20190102學(xué)生的年齡。voidmain(){ structstudentwang= {"WangYunPing",18,"M","2019010001",2019,3,3,"Han","BeiJing",}; structstudentzhang= {"ZhangLi",18,"M","2019010002",2019,4,4,"Han","GuangZhou",}; structstudentstud[3]={ {"WangYunPing",18,"M","2019010001",2019,3,3,"Han","BeiJing",}, {"ZhangLi",18,"M","2019010002",2019,4,4,"Han","GuangZhou",}, {"GuYuPing",18,"F","2019010003",2019,5,5,"Han","ShangHai",}}; structstudent*p; structstudentt; printf("Demoshowage:\n"); showage(wang.age);/*結(jié)構(gòu)體成員作為實(shí)參*/ printf("Demoshow1:\n"); show1(wang);/*結(jié)構(gòu)體變量作為實(shí)參*/ p=&wang; printf("Demoshow2:\n"); show2(p);/*結(jié)構(gòu)體指針作為實(shí)參,也可以寫(xiě)成show2(&wang)*/ printf("Demoshow3:\n"); show3(stud,3);/*結(jié)構(gòu)體數(shù)組名作為實(shí)參*/ /*結(jié)構(gòu)體變量交換*/ t=wang; wang=zhang; zhang=t; printf("Demoswap:\n"); show1(zhang);}【例9-4】打印學(xué)號(hào)為20190102學(xué)生的年齡。運(yùn)行結(jié)果【注意】由于結(jié)構(gòu)體structstudent作為主函數(shù)之外其他函數(shù)的形式參數(shù),所以結(jié)構(gòu)體的定義需要放在函數(shù)之外,不能放在主函數(shù)main內(nèi)。show1(wang)寫(xiě)成show1(stud[0])效果一樣,結(jié)構(gòu)體數(shù)組元素也相當(dāng)于一個(gè)結(jié)構(gòu)體變量,例題中正好對(duì)應(yīng)的成員數(shù)據(jù)也一樣。結(jié)構(gòu)體變量不同于數(shù)組體現(xiàn)在結(jié)構(gòu)體變量名需要計(jì)算才能得到結(jié)構(gòu)體數(shù)據(jù)域的地址,如:&wang。而數(shù)組名直接代表所有數(shù)組元素的首地址,不過(guò)也可以計(jì)算得到某一個(gè)元素的地址,如:&stud[2]【例9-5】演示函數(shù)返回結(jié)構(gòu)體類(lèi)型。

structstudentseek1(structstudents[],intn,charname[]){ inti; for(i=0;i<n;i++) if(strcmp(s[i].name,name)==0) break; returns[i];}structstudent*seek2(structstudents[],intn,charname[]){ inti; for(i=0;i<n;i++) if(strcmp(s[i].name,name)==0) break; return&s[i];}structstudent*seek3(structstudents[],intn,charname[]){ inti; structstudent*p=s; for(i=0;i<n;i++) if(strcmp(p->name,name)==0) break; else p++; returnp;}【例9-5】演示函數(shù)返回結(jié)構(gòu)體類(lèi)型。voidshow1(structstudents){ printf("%s,%d,%s,%s,",,s.age,s.sex,s.xh); printf("%d,%d,%d,",s.birthday.year,s.birthday.month,s.birthday.day); printf("%s,%s,%s\n",s.nation,s.address,s.tel);}voidshow2(structstudent*p){ printf("%s,%d,%s,%s,",p->name,p->age,p->sex,p->xh); printf("%d,%d,%d,",p->birthday.year,p->birthday.month,p->birthday.day); printf("%s,%s,%s\n",p->nation,p->address,p->tel);}【例9-5】演示函數(shù)返回結(jié)構(gòu)體類(lèi)型。main(){ structstudentstud[3]={ {"WangYunPing",18,"M","2019010001",2019,3,3,"Han","BeiJing",}, {"ZhangLi",18,"M","2019010002",2019,4,4,"Han","GuangZhou",}, {"GuYuPing",18,"F","2019010003",2019,5,5,"Han","ShangHai",}}; show1(seek1(stud,3,"GuYuPing")); show2(seek2(stud,3,"ZhangLi")); show2(seek3(stud,3,"WangYunPing"));}9.2共用體為了節(jié)約內(nèi)存或便于對(duì)數(shù)據(jù)進(jìn)行處理,C語(yǔ)言允許不同類(lèi)型的數(shù)據(jù)共享在一段存儲(chǔ)單元,這種共享存儲(chǔ)單元的特殊數(shù)據(jù)類(lèi)型叫做“共用體”類(lèi)型,也可稱(chēng)之為“聯(lián)合”類(lèi)型。共用體的定義和結(jié)構(gòu)體相似,可以借鑒結(jié)構(gòu)體部分,其中不同的地方在本節(jié)中將逐一指出。9.2.1共用體類(lèi)型的定義共用體類(lèi)型的定義形式為:union類(lèi)型名{

成員說(shuō)明列表};例如:uniondata{charc;floatf;doubled;};9.2.2共用體變量的說(shuō)明和引用與結(jié)構(gòu)體變量的說(shuō)明類(lèi)似,也有3種方式:先定義共用體類(lèi)型,再用共用體類(lèi)型定義共用體變量。union類(lèi)型名{

成員說(shuō)明列表};union類(lèi)型名共用體變量名表;。例如,uniondatax;定義共用體類(lèi)型名的同時(shí)定義共用體變量。union類(lèi)型名{成員說(shuō)明列表}共用體變量名表;不定義類(lèi)型名直接定義共用體變量注意union

data或變量x,表達(dá)式sizeof(union

data)和sizeof(x)的值均為8。

引用共用體變量引用共用體變量的形式以及注意事項(xiàng)均與引用結(jié)構(gòu)體變量相似,例如:x.c/*共用體字符型成員,相當(dāng)于普通字符型變量*/對(duì)共用體變量中的任何一個(gè)成員賦值,都會(huì)導(dǎo)致共享區(qū)域數(shù)據(jù)發(fā)生變化,所以共用體只能保證只有一個(gè)成員的值是有效的。例如,對(duì)于共用體變量x,假設(shè)有:x.f=3.14159;必然使得地址1000~1011四個(gè)字節(jié)的內(nèi)容發(fā)生變化整體引用共用體變量沒(méi)有多大的意義,通常都是引用共用體變量的成員【例9-6】演示共用體類(lèi)型的引用

#include"stdio.h"#include"string.h"structdate{ intyear; intmonth; intday; };unioncall{ charmobile[20]; inttelephone; };structstudent{ charname[20]; intage; charsex[3]; charxh[11]; structdatebirthday; charnation[20]; charaddress[20]; unioncallcallnumber;};【例9-6】演示共用體類(lèi)型的引用voidmain(){ structstudentwang= {"WangYunPing",18,"M","2019010001",2019,3,3,"Han","BeiJing"}; structstudentli= {"LiZhen",20,"F","2019010001",2019,3,3,"Han","HeFei"}; structstudent*p; strcpy(wang.callnumberle,); li.callnumber.telephone=56023328; p=&wang; printf("%s,%d,%s,%s,",p->name,p->age,p->sex,p->xh); printf("%d,%d,%d,",p->birthday.year,p->birthday.month,p->birthday.day); printf("%s,%s,%s\n",p->nation,p->address,p->callnumberle); p=&li; printf("%s,%d,%s,%s,",p->name,p->age,p->sex,p->xh); printf("%d,%d,%d,",p->birthday.year,p->birthday.month,p->birthday.day); printf("%s,%s,%ld\n",p->nation,p->address,p->callnumber.telephone);}【例9-7】運(yùn)行下面的程序,分析運(yùn)行結(jié)果。#include<stdio.h>#include<string.h>voidmain(){ unionkeycode { shortinti; charc[2]; }key; printf("size=%d\n",sizeof(key)); key.i=16961;/*0x4241*/ printf("key.c[0]=%d,key.c[1]=%d\n",key.c[0],key.c[1]); strcpy(key.c,"AB"); printf("key.c[0]=%c,key.c[1]=%c\n",key.c[0],key.c[1]); printf("key.i=%d(0x%x)\n",key.i,key.i);}【分析】共用體變量key有兩個(gè)成員:shortint型成員i和字符數(shù)組c,它們都占用2字節(jié),因此共用體變量key長(zhǎng)度為2字節(jié)。給shortint型成員i賦值16961,然后將該數(shù)據(jù)的兩個(gè)字節(jié)用字符數(shù)組c分別輸出,低位字節(jié)key.c[0]為十六進(jìn)制數(shù)42,對(duì)應(yīng)字符'B';高位字節(jié)key.c[1]為十六進(jìn)制數(shù)41,對(duì)應(yīng)字符'A'。給字符數(shù)組key.c賦值"AB",得到的結(jié)果和前面一樣。由于長(zhǎng)度的限制,這里strcpy沒(méi)能把字符串結(jié)束符存入key.c,對(duì)于本題沒(méi)有關(guān)系。由此可以看出,key.i被key.c[0]、key.c[1]拆開(kāi)成兩部分,從而分別取得其高位或低位字節(jié)部分的內(nèi)容。9.3枚舉類(lèi)型引入假設(shè)有序列Sunday、Monday、Tuesday、Wednesday、Thursday、Friday、Saturday,從星期的名稱(chēng)上不能體現(xiàn)他們的順序,但如果將其與下面的序列對(duì)應(yīng)就可以體現(xiàn)了:0、1、2、3、4、5、6。這兩種序列都有優(yōu)點(diǎn),前者表達(dá)的意義自然明確,容易接受;后者更能體現(xiàn)星期名稱(chēng)之間的順序。能否將二者結(jié)合起來(lái),形成一種新的數(shù)據(jù)類(lèi)型?9.3.1枚舉類(lèi)型的定義枚舉類(lèi)型定義的形式為:enum

類(lèi)型名{標(biāo)識(shí)符序列};如:enumweek{Sunday,Monday,Tuesday,Wednesday,Thursday,Friday,Saturday};enum是定義枚舉類(lèi)型的關(guān)鍵字,枚舉類(lèi)型week包含7個(gè)標(biāo)識(shí)符序列,分別等于0、1、2、3、4、5、6,這些標(biāo)識(shí)符常量是有序的。注意枚舉值標(biāo)識(shí)符是常量不是變量,這些常量是基本數(shù)據(jù)類(lèi)型。枚舉值只能是一些標(biāo)識(shí)符,不能是基本類(lèi)型常量。下面的定義是錯(cuò)誤的:enumweek{0,1,2,3,4,5,6};可以在定義枚舉類(lèi)型時(shí)對(duì)枚舉常量重新定義值,如:enumweek{Monday=1,Tuesday,Wednesday,Thursday,Friday,Saturday,Sunday};這樣對(duì)應(yīng)的序列為:1、2、3、4、5、6、7。下面的定義也是可以的:enumcolor{black,blue,green,red=4,yellow=14,white};此時(shí)red為4,yellow為14,white為15。9.3.2枚舉變量的定義和引用枚舉變量的定義形式可以為:enum類(lèi)型名變量名表;enum類(lèi)型名{標(biāo)識(shí)符序列}變量名表;enum{標(biāo)識(shí)符序列}變量名表;例如:enumcolorbackcolor;enumcolor{black,blue,green,red=4,yellow=14,white}backcolor;enum{black,blue,green,red=4,yellow=14,white}backcolor;enumweekfirstweek,nextweek;枚舉變量的引用正確的引用方式:backcolor=red;backcolor=4;backcolor++;/*假設(shè)原來(lái)是red,現(xiàn)在將變成yellow了*/if(backcolor==red)printf("Thecolorisredscanf("%d",&backcolor);/*輸入一個(gè)整型數(shù)給backcolor變量,不過(guò)必須在枚舉類(lèi)型定義的范圍之內(nèi),可以是0、1、2、4、14、15,其他都是錯(cuò)誤的。*/錯(cuò)誤的引用方式backcolor=3; /*不在枚舉類(lèi)型定義的范圍之內(nèi)*/backcolor=grey; /*不在枚舉類(lèi)型定義的范圍之內(nèi)*/由于枚舉變量可以作為循環(huán)變量,因此可以利用循環(huán)和switch語(yǔ)句打印全部的枚舉值字符串?!纠?-8】輸出全部的枚舉值字符串。

#include<stdio.h>enumeweek{Monday=1,Tuesday,Wednesday,Thursday, Friday,Saturday,Sunday};voidmain(){ charweekname[7][20]={ "Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"}; enumeweekweek; for(week=Monday;week<=Sunday;week++) printf("%d:%s\n",week,weekname[week%7]);}9.4用戶(hù)定義類(lèi)型C語(yǔ)言不僅提供了豐富的數(shù)據(jù)類(lèi)型,還允許用于自己定義類(lèi)型說(shuō)明符,相當(dāng)于允許用戶(hù)為數(shù)據(jù)類(lèi)型取“別名”。所用的類(lèi)型定義符是typedef。9.4用戶(hù)定義類(lèi)型名稱(chēng)替換定義的形式為:typedef類(lèi)型名別名;“類(lèi)型名”必須是系統(tǒng)提供的數(shù)據(jù)類(lèi)型或用戶(hù)已定義的數(shù)據(jù)類(lèi)型,“別名”是標(biāo)識(shí)符。例如:typedef intINTEGER;typedef structstudent STUDENT;typedef struct{intyear;intmonth;intday}DATE;typedef char*CHAR; /*char*是字符指針類(lèi)型*/9.4用戶(hù)定義類(lèi)型有了上面的替換,就可以定義相應(yīng)類(lèi)型的變量了:INTEGERa,b; /*相當(dāng)于inta,b*/STUDENTwang,zhang; /*相當(dāng)于structstudentwang,zhang;*/DATEbirthday;/*相當(dāng)于struct{intyear;intmonth;intday}birthday;*/CHARstring="HelloWorld!"; /*相當(dāng)于char*string="HelloWorld!"*/CHARp=&s; /*相當(dāng)于char*p=&s*/9.4用戶(hù)定義類(lèi)型定義數(shù)組類(lèi)型定義的形式為:typedef類(lèi)型名別名[數(shù)組長(zhǎng)度];例如:typedefintNUM[3];typedefcharSTRING[20];定義相應(yīng)類(lèi)型的變量:NUMa,b; /*相當(dāng)于inta[3],b[3]*/STRINGs; /*相當(dāng)于chars[20]*/就定義了該結(jié)構(gòu)體類(lèi)型的變量和指針變量9.4用戶(hù)定義類(lèi)型注意:定義新類(lèi)型名時(shí)一般用大寫(xiě)的標(biāo)識(shí)符,以便區(qū)別于習(xí)慣的寫(xiě)法,并不是必須的。用typedef定義類(lèi)型只是定義新的類(lèi)型名而不是創(chuàng)建新的數(shù)據(jù)類(lèi)型。注意定義新類(lèi)型名與宏替換的區(qū)別。例如:typedefintINTEGER;#defineINTEGERint上述定義的作用都是用標(biāo)識(shí)符INTEGER代替int,但實(shí)質(zhì)不同。typedef是用標(biāo)識(shí)符INTEGER代替類(lèi)型“int”,而#define是用標(biāo)識(shí)符INTEGER代替字符串“int”;typedef在編譯時(shí)解釋INTEGER,而#define是在編譯之前將INTEGER替換成字符串“int”;typedef并不是做簡(jiǎn)單替換,例如:typedefintNUM[3];不是簡(jiǎn)單地將NUM[3]替換成int,因?yàn)镹UMa;相當(dāng)于inta[3];而不是inta;。9.5程序舉例【例9-9】編程求兩個(gè)復(fù)數(shù)的和。

#include<stdio.h>structcomplex{ doubler; doublei; };structcomplexadd(structcomplexx,structcomplexy){ structcomplexz; z.r=x.r+y.r; z.i=x.i+y.i; returnz;}voidmain(){ structcomplexz,add(structcomplex,structcomplex); structcomplexx={1.2,2.5},y={2.4,5.6}; z=add(x,y); printf("x+y=%.2f+%.2fi\n",z.r,z.i);}【例9-10】已知今天的日期,編程求出明天的日期。#include<stdio.h>structdate{ intyear,month,day; };intjudge(structdate*pd){ intl_year=0; if((pd->year%4==0&&pd->year%100!=0)||pd->year%400==0) l_year=1; returnl_year;}intday_no(structdate*pd){ intday; intmonth[13]={0,31,28,31,30,31,

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
  • 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ì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論