版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領
文檔簡介
第八章結構體、共用體和枚舉類型8.1
結構體8.2
共用體8.3
枚舉類型8.4
用typedef定義類型/1第八章結構體、共用體和枚舉類型8.1結構體8.2共用結構體是一種構造數(shù)據(jù)類型用途:把不同類型的數(shù)據(jù)組合成一個整體-------自定義數(shù)據(jù)類型struct[結構體名]{
類型標識符成員名;類型標識符成員名;
…………….};成員類型可以是基本型或構造型struct是關鍵字,不能省略合法標識符可省:無名結構體8.1.1結構體類型聲明8.1結構體結構體類型定義/2結構體是一種構造數(shù)據(jù)類型struct[結構體名例struct
student{intnum;charname[20];charsex;intage;floatscore;charaddr[30];};namenumsexagescoreaddr2字節(jié)2字節(jié)20字節(jié)1字節(jié)4字節(jié)30字節(jié)……..結構體類型定義描述結構的組織形式,不分配內(nèi)存結構體類型定義的作用域8.1結構體structstudent應作為一個類型整體,num,name[20]等都只是其中的成員,且struct及“}”后的“;”不能省略。/3例structstudentnamenumse8.1結構體例個人數(shù)據(jù):包含姓名、性別、年齡、身高、體重、住址:structperson{charname[20];/*姓名*/charsex;/*性別*/intage;/*年齡*/floatheight;/*身高*/floatweight;/*體重*/charaddr[50];/*住址*/};structdate{intyear;/*年*/month;/*月*/day;/*日*/};例日期,包括年、月、日:/48.1結構體例個人數(shù)據(jù):包含姓名、性別、年齡、身高、體8.1結構體如職工信息結構體類型為:structperson{charname[20];/*姓名*/charaddress[40];/*地址*/floatsalary;/*工資*/floatcost;/*扣款*/structdatehiredate;
/*聘任日期*/};結構體類型可以嵌套定義
即一個結構體類型中的某些成員又是其他結構體類型
/58.1結構體如職工信息結構體類型為:結構體類型可以嵌套定8.1結構體8.1.2結構體變量的定義先定義結構體類型,再定義結構體變量一般形式:struct結構體名{
類型標識符成員名;類型標識符成員名;
…………….};struct結構體名變量名表列;例structstudent{intnum;charname[20];charsex;intage;floatscore;charaddr[30];};structstudentstu1,stu2/68.1結構體8.1.2結構體變量的定義先定義結構體類型,定義結構體類型的同時定義結構體變量一般形式:
8.1結構體struct結構體名{
類型標識符成員名;類型標識符成員名;
…………….}變量名表列;例structstudent{intnum;charname[20];charsex;intage;floatscore;charaddr[30];}stu1,stu2;/7定義結構體類型的同時定義結構體變量8.1結構體struct8.1結構體直接定義結構體變量一般形式:
struct{
類型標識符成員名;類型標識符成員名;
…………….}變量名表列;例struct{intnum;charname[20];charsex;intage;floatscore;charaddr[30];}stu1,stu2;用無名結構體直接定義變量只能一次/88.1結構體直接定義結構體變量struct例str8.1結構體說明:結構體類型與結構體變量概念不同類型:不分配內(nèi)存;變量:分配內(nèi)存類型:不能賦值、存取、運算;變量:可以結構體可嵌套結構體成員名與程序中變量名可相同,不會混淆結構體類型及變量的作用域與生存期/98.1結構體說明:/98.1結構體8.1.3結構體變量的引用引用規(guī)則結構體變量不能整體引用,只能引用變量成員引用方式:結構體變量名.成員名成員(分量)運算符優(yōu)先級:1結合性:從左向右如果結構體變量類型相同,可以將一個結構體變量賦值給另一個結構體變量結構體嵌套時逐級引用例;stu1=stu2;例:stu1.birthday.day=23;stu1.birthday.month=8;stu1.birthday.year=2003;/108.1結構體8.1.3結構體變量的引用引用規(guī)則成員(分量8.1結構體8.1.4結構體變量的使用1、結構體變量的初始化形式一:struct結構體名{
類型標識符成員名;類型標識符成員名;
…………….};struct結構體名結構體變量={初始數(shù)據(jù)};例structstudent{intnum;charname[20];charsex;intage;charaddr[30];};structstudentstu1={112,“WangLin”,‘M’,19,“200BeijingRoad”};/118.1結構體8.1.4結構體變量的使用1、結構體變量的8.1結構體形式二:struct結構體名{
類型標識符成員名;類型標識符成員名;
…………….}結構體變量={初始數(shù)據(jù)};例structstudent{intnum;charname[20];charsex;intage;charaddr[30];}stu1={112,“WangLin”,‘M’,19,“200BeijingRoad”};/128.1結構體形式二:struct結構體名例8.1結構體形式三:struct{
類型標識符成員名;類型標識符成員名;
…………….}結構體變量={初始數(shù)據(jù)};例struct{intnum;charname[20];charsex;intage;charaddr[30];}stu1={112,“WangLin”,‘M’,19,“200BeijingRoad”};/138.1結構體形式三:struct例struct/18.1結構體2、結構體變量的輸入輸出不允許對結構體變量進行整體的輸入輸出如:scanf(“%s%c%d%f”,&stu1);structstudent{intnum;intage;floatscore;}stu;voidmain(){printf("Enternum,age,score:");scanf("%d,%d,%f",&stu.num,&stu.age,&stu.score);printf("num:%d,age:%d,score:%.1f\n",stu.num,stu.age,stu.score);}程序運行過程:Enternum,age,score:1001,19,98.5↙num:1001,age:19,score:98.5/148.1結構體2、結構體變量的輸入輸出structstud結構體數(shù)組的定義形式一:
structstudent{intnum;charname[20];charsex;intage;};structstudentstu[2];形式二:structstudent{intnum;charname[20];charsex;intage;}stu[2];形式三:struct{intnum;charname[20];charsex;intage;}stu[2];numnamesexagenumnamesexagestu[0]stu[1]25B8.1結構體8.1.5結構體數(shù)組/15結構體數(shù)組的定義形式一:形式二:形式三:numnames例struct{intnum;charname[20];charsex;intage;}stu[]={{……},{……},{……}};引用方式:結構體數(shù)組名[下標].成員名structstudent{intnum;charname[20];charsex;intage;}str[3];stu[1].age++;strcpy(stu[0].name,”ZhaoDa”);8.1結構體結構體數(shù)組的初始化結構體數(shù)組的引用/16例struct引用方式:結構體數(shù)組名[下標].成structperson{charname[20];intcount;}leader[3]={“Li”,0,“Zhang”,0,”Wang“,0};main(){inti,j;charleader_name[20];
for(i=1;i<=10;i++){scanf("%s",leader_name);
for(j=0;j<3;j++) if(strcmp(leader_name,leader[j].name)==0) leader[j].count++;}for(i=0;i<3;i++)printf("%5s:%d\n",leader[i].name,leader[i].count);}namecountLiZhangWang000例統(tǒng)計后選人選票8.1結構體/17structpersonnamecountLiZhangW8.1結構體8.1.6結構體指針變量一個指針變量可以指向一個結構體數(shù)組元素(將該結構體數(shù)組的數(shù)組元素地址賦給此指針變量)。例struct{inta;floatb;}arr[3],*p;p=arr;此時p指向arr數(shù)組的第一個元素,“p=arr;”等價于“p=&arr[0];”。若執(zhí)行“p++;”則此時指針變量p此時指向arr[1]。定義形式:struct結構體名*結構體指針名;例structstudent*p;存放結構體變量在內(nèi)存的起始地址numnamesexagestupstructstudent{intnum;charname[20];charsex;intage;}stu;structstudent*p=&stu;/188.1結構體8.1.6結構體指針變量一個指針變量可以指使用結構體指針變量引用成員形式指向運算符優(yōu)先級:1結合方向:從左向右例intn;int*p=&n;*p=10;
n=10structstudentstu1;structstudent*p=&stu1;stu1.num=101;
(*p).num=1018.1結構體結構體指針名->成員名結構體變量名.成員名(*結構體指針名).成員名/19使用結構體指針變量引用成員形式指向運算符例int8.1結構體例輸出數(shù)組中各元素中各成員的值。structstudent{intnum;charname[20];charsex;intage;};structstudentstu[3]={{10101,"Zhang",'M',18},{10102,"Li",'M',19},{10103,"Wang",'F',20}};main(){structstudent*p;printf("No.Namesexage\n");for(p=stu;p<stu+3;p++)printf("%5d%-20s%2c4d\n",p->num,p->name,p->sex,p->age);}/208.1結構體例輸出數(shù)組中各元素中各成員的值。ma8.1結構體10101"Zhang"'M'1810102"Li"'M'1910103"Wang"'F'20stu[0]stu[1]stu[2]PP’P”指針移動示意圖:注意:①如果p的初值為stu,即指向第一個元素,則p+1后指向下一個元素的起始地址。請區(qū)別:
(++p)->num和(p++)->num②指針p已定義為指向structstudent類型的數(shù)據(jù),它只能指向該結構體類型數(shù)據(jù),而不能指向一元素的某一成員(即p的地址不能是成員的地址)。如下面的賦值是錯誤的:
p=&/218.1結構體10101stu[0]stu[1]stu[2]8.1結構體8.1.7結構體與函數(shù)1、結構體變量作函數(shù)參數(shù)有時需要將一個結構體變量的值傳遞給另一個函數(shù)可以:
用結構體變量的成員作參數(shù)。用法和普通變量作實參是一樣的,屬“值傳遞”方式。形參與實參都用結構體變量直接將實參結構體變量的各個成員的值全部傳遞給形參的結構體變量。注意:實參和形參類型應當完全一致。/228.1結構體8.1.7結構體與函數(shù)1、結構體變量作函數(shù)參structdata{inta,b,c;};main(){voidfunc(structdata);structdataarg;arg.a=27;arg.b=3;arg.c=arg.a+arg.b;printf("arg.a=%darg.b=%darg.c=%d\n",arg.a,arg.b,arg.c);printf("CallFunc()....\n");
func(arg);printf("arg.a=%darg.b=%darg.c=%d\n",arg.a,arg.b,arg.c);}voidfunc(structdataparm){printf("parm.a=%dparm.b=%dparm.c=%d\n",parm.a,parm.b,parm.c);printf("Process...\n");parm.a=18;parm.b=5;parm.c=parm.a*parm.b;printf("parm.a=%dparm.b=%dparm.c=%d\n",parm.a,parm.b,parm.c);printf("Return...\n");}8.1結構體arga:27b:3c:30(main)arga:27b:3c:30(main)(func)parma:27b:3c:30copyarga:27b:3c:30(main)(func)parma:18b:5c:90arga:27b:3c:30(main)/23structdata8.1結構體arga:27b:38.1結構體用指向結構體變量(或數(shù)組)的指針作實參,將結構體變量(或數(shù)組)的地址傳給形參。形參為指針變量,實參為結構體變量的地址或指向結構體變量的指針。2、結構體指針作函數(shù)參數(shù)/248.1結構體用指向結構體變量(或數(shù)組)的指針作實參,將結8.1結構體structdata{inta,b,c;};main(){voidfunc(structdata*parm);structdataarg;arg.a=27;arg.b=3;arg.c=arg.a+arg.b;printf("arg.a=%darg.b=%darg.c=%d\n",arg.a,arg.b,arg.c);printf("CallFunc()....\n");
func(&arg);printf("arg.a=%darg.b=%darg.c=%d\n",arg.a,arg.b,arg.c);}voidfunc(structdata*parm){printf("parm->a=%dparm->b=%dparm->c=%d\n",parm->a,parm->b,parm->c);printf("Process...\n");parm->a=18;parm->b=5;parm->c=parm->a*parm->b;printf("parm->a=%dparm->b=%dparm->c=%d\n",parm->a,parm->b,parm->c);printf("Return...\n");}arga:27b:3c:30(main)arga:27b:3c:30(main)(func)parm****arga:18b:5c:90(main)(func)parm****arga:18b:5c:90(main)/258.1結構體structdataarga:27b:38.1結構體例有一個結構體變量stu,內(nèi)含學生學號、姓名和三門課的成績。要求在main函數(shù)中賦值,在另一函數(shù)print中將它們打印輸出。程序如下。#include"string.h"#defineformat"%d\n%s\n%f\n%f\n%f\n"structstudent{intnum;charname[20];floatscore[3];};main(){voidprint();structstudentstu;stu.num=12345;strcpy(,"LiPing");stu.score[0]=67.5;stu.score[1]=89;stu.score[2]=78.5;print(&stu);}voidprint(structstudent*p){printf(format,p->num,p->name,p->score[0],p->score[1],p->score[2]);printf("\n");}/268.1結構體例有一個結構體變量stu,內(nèi)含學生學號、姓名8.1結構體值得指出的是,把一個完整的結構體變量作為參數(shù)傳遞,雖然合法,但要將全部成員值一個一個傳遞,既費時間又費空間,開銷大,因此一般不采用。上例的print函數(shù)形參改用結構體變量后程序如下:注意:ANSIC允許用整個結構體作為函數(shù)的參數(shù)傳遞,但是必須保證實參與形參的類型相同。#include"string.h"#defineformat"%d\n%s\n%f\n%f\n%f\n"structstudent{intnum;charname[20];floatscore[3];};main(){voidprint();structstudentstu;stu.num=12345;strcpy(,"LiPing");stu.score[0]=67.5;stu.score[1]=89;stu.score[2]=78.5;print(stu);}voidprint(p)structstudentp;{printf(format,p.num,,p.score[0],p.score[1],p.score[2]);printf("\n");}/278.1結構體值得指出的是,把一個完整的結構體變量作為參數(shù)8.1結構體
ANSIC還允許函數(shù)返回結構體類型的值。設有一個structstudent類型,結構體變量定義如下:structstudentstud[30];若函數(shù)input()的功能是輸入一個學生結構體數(shù)據(jù),并將其返回給第i個學生記錄stud[i],即:for(k=0;k<30;k++)stud[k]=input();3、返回結構體類型值的函數(shù)input()函數(shù)定義如下:structstudentinput(){intk;structstudentstud;scanf("%d",&stud.num);gets();for(k=0;k<3;k++)scanf("%f",&stud.score[k]);returnstud;}/288.1結構體
ANSIC還允許函數(shù)返回結構體類型的值。8.2共用體8.2.1共用體類型聲明結構體類型定義構造數(shù)據(jù)類型,也叫聯(lián)合體用途:使幾個不同類型的變量共占一段內(nèi)存(相互覆蓋)union共用體名{
類型標識符成員名;類型標識符成員名;
…………….};例uniondata{inti;charch;floatf;};fchi類型定義不分配內(nèi)存/298.2共用體8.2.1共用體類型聲明結構體類型定義構造8.2共用體8.2.2共用體變量定義形式一:uniondata{inti;charch;floatf;}a,b;fchifchiab形式二:uniondata{inti;charch;floatf;};uniondataa,b,c,*p,d[3];形式三:union{inti;charch;floatf;}a,b,c;共用體變量定義分配內(nèi)存,長度=最長成員所占字節(jié)數(shù)共用體變量任何時刻只有一個成員存在/308.2共用體8.2.2共用體變量定義形式一:fchifc8.2共用體8.2.3共用體變量的引用引用方式:結構體變量名.成員名引用規(guī)則不能引用共用體變量,只能引用其成員共用體變量中起作用的成員是最后一次存放的成員不能在定義共用體變量時初始化可以用一個共用體變量為另一個變量賦值共用體變量的地址和它的各個成員的地址相同共用體變量不能作函數(shù)參數(shù),函數(shù)的返回值也不能是共用體類型共用體類型和結構體類型可以相互嵌套,共用體中成員可以為數(shù)組,甚至還可以定義共用體數(shù)組共用體指針名->成員名共用體變量名·成員名(*共用體指針名).成員名uniondata{inti;charch;floatf;};uniondataa,b,c,*p,d[3];a.ia.cha.fp->ip->chp->f(*p).i(*p).ch(*p).fd[0].id[0].chd[0].f例union{inti;charch;floatf;}a;a=1;(
)例a.i=1;a.ch=‘a(chǎn)’;a.f=1.5;printf(“%d”,a.i);(
編譯通過,運行結果不對)例union{inti;charch;floatf;}a={1,’a’,1.5};(
)例floatx;union{inti;charch;floatf;}a,b;a.i=1;a.ch=‘a(chǎn)’;a.f=1.5;b=a;(
)x=a.f;(
)/318.2共用體8.2.3共用體變量的引用引用方式:結8.2共用體例將一個整數(shù)按字節(jié)輸出main(){unionint_char{inti;charch[2];}x;x.i=24897;printf("i=%o\n",x.i);printf("ch0=%o,ch1=%o\nch0=%c,ch1=%c\n", x.ch[0],x.ch[1],x.ch[0],x.ch[1]);}0110000101000001低字節(jié)高字節(jié)0100000101100001ch[0]ch[1]運行結果:i=60501ch0=101,ch1=141ch0=A,ch1=a/328.2共用體例將一個整數(shù)按字節(jié)輸出main()01100結構體與共用體區(qū)別:存儲方式不同聯(lián)系:兩者可相互嵌套achkstructnode{charch[2];intk;}a;unionnode{charch[2];intk;}b;bchk變量的各成員同時存在任一時刻只有一個成員存在/33結構體與共用體區(qū)別:存儲方式不同聯(lián)系:兩者可相互嵌套ac8.3枚舉類型8.3.1枚舉類型的聲明枚舉類型定義枚舉數(shù)據(jù)類型,指這種類型變量的取值只能限于事前已經(jīng)一一列舉出來的值的范圍
enum枚舉類型名{
枚舉常量;;枚舉常量;;
…………….};例enumweekday{sun,mon,tue,wed,thu,fri,sat};/348.3枚舉類型8.3.1枚舉類型的聲明枚舉類型定義枚舉8.3枚舉類型8.3.2枚舉類型變量的定義形式一:
enumweekday{sun,mon,tue,wed,thu,fri,sat}a,b;形式二:enumweekday{sun,mon,tue,wed,thu,fri,sat};enumweekdaya,b;形式三:
enum{sun,mon,tue,wed,thu,fri,sat}a,b;/358.3枚舉類型8.3.2枚舉類型變量的定義形式一:形式二8.3枚舉類型說明:enum是關鍵字,標識枚舉類型,定義枚舉類型時必須用enum開頭。在定義枚舉類型時,花括號中的枚舉元素是常量,這些元素的名字是程序設計者自己指定的,命名規(guī)則與標識符相同。這些名字只是作為一個符號,以利于提高程序的可讀性,并無其它固定的含義。枚舉元素是常量,在C編譯器中,按定義時的排列順序取值0、1、2、...。定義枚舉類型時,可在枚舉數(shù)據(jù)時通過“=”號規(guī)定序號,并影響后面的枚舉數(shù)據(jù)的序號,后繼序號以此遞增。枚舉元素是常量,不是變量,可以將枚舉常量賦給一個枚舉變量,但不能對枚舉元素賦值。但在定義枚舉類型時,可以指定枚舉常量的值枚舉值可以作判斷比較整型與枚舉類型是不同的數(shù)據(jù)類型,不能直接賦值,但可以通過強制類型轉(zhuǎn)換賦值枚舉常量不是字符串不能用下面的方法輸出字符串“sun”:printf("%s",sun); (
)而應用檢查的方法去處理:if(week1==sun)printf("sun");例week1=wed;printf("%d",week1);輸出整數(shù)3enumstatus{copy=6,delete};則copy的序號為6,delete的序號為7。week2=sat; (
)sun=0;mon=1; (
)enumweekday{sun=7,mon=1,tue,wed,thu,fri,sat};tue、wed、...的值從mon的值順序加1。如,tue=2/368.3枚舉類型說明:不能用下面的方法輸出字符串“sun”:例某口袋中有紅、黃、藍、白、黑五種顏色的球若干個,每次從口袋中取出三個球,問得到三種不同顏色的球有多少種取法,并輸出每種組合結果。8.3枚舉類型for(n=0,i=1;i<=5;i++)/*取第一個球*/for(j=1;j<=5;j++)/*取第二個球*/if(i!=j)/*第一個與第二個不同色*/{for(k=1;k<=5;k++)/*取第三個球*/if((k!=i)&&(k!=j)){n++;/*統(tǒng)計有多少種取法*/printf(″%d,%d,%d\n″,i,j,k);/*輸出一種取法*/}}不用枚舉類型:/37例某口袋中有紅、黃、藍、白、黑五種顏色的球若干個,8.3枚舉類型采用枚舉類型來描述數(shù)據(jù)。設用red表示紅色球,yellow表示黃色球,blue表示藍色球,white表示白色球,black表示黑色球。/388.3枚舉類型采用枚舉類型來描述數(shù)據(jù)。設用red表示紅main(){enumcolor{red,yellow,blue,white,black};enumcolori,j,k,l;intn,m;for(n=0,i=red;i<=black;i++)for(j=red;j<=black;;j++)if(i!=j){for(k=red;k<=black;k++)if((k!=i)&&(k!=j)){n++;printf(″%4d″,n);for(m=1;m<=3;m++){switch(m){case1:l=i;berak;case2:l=j;berak;case3:l=k;berak;}switch(l)/*間接輸出*/{casered:printf(″%8s″,″red″),break;caseyellow:printf(″%8s″,″yellow″);break;caseblue:printf(″%8s″),″blue″);break;casewhite:printf(″%8s″,″white″);break;;caseblack:printf(″%8s″,″black″);break;}}printf(″\n″);}}printf(″總的取法有%d種\n″,n);}/39
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年度餐廳招牌設計制作合同范本3篇
- 2025年醫(yī)療器械注冊代理與質(zhì)量管理體系認證合同4篇
- 2025年度體育賽事代理公司注銷服務協(xié)議4篇
- 2025版二手貨車交易合同范本3篇
- 2025年度城市綜合體地下空間物業(yè)服務合同4篇
- 武漢托管班2025年度教師招聘與教育咨詢服務合同3篇
- 2024版國際碳排放交易合同
- 2025版農(nóng)產(chǎn)品銷售合同范例(含保鮮物流)2篇
- 二零二五版苗圃技術員土壤改良與肥料施用合作協(xié)議4篇
- 2025版?zhèn)€人股權質(zhì)押協(xié)議(股權融資)3篇
- 小兒甲型流感護理查房
- 霧化吸入療法合理用藥專家共識(2024版)解讀
- 拆遷評估機構選定方案
- 趣味知識問答100道
- 鋼管豎向承載力表
- 2024年新北師大版八年級上冊物理全冊教學課件(新版教材)
- 人教版數(shù)學四年級下冊核心素養(yǎng)目標全冊教學設計
- JJG 692-2010無創(chuàng)自動測量血壓計
- 三年級下冊口算天天100題(A4打印版)
- CSSD職業(yè)暴露與防護
- 移動商務內(nèi)容運營(吳洪貴)項目三 移動商務運營內(nèi)容的策劃和生產(chǎn)
評論
0/150
提交評論