自定義數(shù)據(jù)類型_第1頁
自定義數(shù)據(jù)類型_第2頁
自定義數(shù)據(jù)類型_第3頁
自定義數(shù)據(jù)類型_第4頁
自定義數(shù)據(jù)類型_第5頁
已閱讀5頁,還剩55頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領

文檔簡介

自定義數(shù)據(jù)類型第一頁,共六十頁,編輯于2023年,星期一問題引出:信息管理

一個學生的信息有學號、姓名、性別、年齡、住址、成績等。一本圖書的信息有分類編號、書名、作者、出版社、出版日期、價格、庫存量等。如何描述這些類型不同的相關數(shù)據(jù)?C語言為我們提供了自己定義數(shù)據(jù)類型的機制,在這種機制下,數(shù)據(jù)管理將會非常方便。另外,這些自定義的數(shù)據(jù)類型還便于數(shù)據(jù)的封裝與隱藏,這些都為我們寫出更好的軟件奠定了基礎。

?結構體第二頁,共六十頁,編輯于2023年,星期一學習目標結構體、共用體的有關概念和定義方法結構體數(shù)組與結構體指針鏈表的有關概念自定義數(shù)據(jù)類型的方法第三頁,共六十頁,編輯于2023年,星期一課程內(nèi)容10.1概述10.2結構體10.3共用體10.4用typeof定義數(shù)據(jù)類型10.5枚舉類型第四頁,共六十頁,編輯于2023年,星期一10.2結構體1.結構體的定義與應用結構體定義的一般形式為:struct結構體類型名{

數(shù)據(jù)類型成員1;

數(shù)據(jù)類型成員2; …

數(shù)據(jù)類型成員N;};struct為關鍵字;結構體名是用戶定義的類型標識。{}中是組成該結構體的成員。成員的數(shù)據(jù)類型可以是C語言所允許的任何數(shù)據(jù)類型。

第五頁,共六十頁,編輯于2023年,星期一

如學生的基本信息,包括學號、姓名、性別、年齡、班級、成績等數(shù)據(jù)項。這些數(shù)據(jù)項描述了一個學生的幾個不同側面。nonamesexageclassnograde獨立的變量表示:

數(shù)據(jù)項之間無關聯(lián)nonamesexageclassnograde結構體變量表示:

數(shù)據(jù)項為一個整體struct

student

{

charno[9];//學號

charname[20];//姓名

charsex;//性別

unsignedintage;//年齡

unsignedintclassno;//班級

floatgrade;

//成績}第六頁,共六十頁,編輯于2023年,星期一結構體的定義1.先定義結構體類型,再定義結構體變量幾種錯誤的定義方法struct

結構體類型名{

數(shù)據(jù)類型名1成員名1;

……

數(shù)據(jù)類型名n成員名n;};struct結構體類型名變量名列表;structchild{ charinitial; intage; intgrade; }structchildboy,girl;例:一次可定義多個變量structchild;沒有結構體類型名childboy;缺省struct關鍵字structPointp;structPoint{intx,y;};結構類型Point定義在后第七頁,共六十頁,編輯于2023年,星期一結構體的定義2.在聲明類型的同時定義變量,如:

struct[結構體類型名]{

數(shù)據(jù)類型名1成員名1;

……

數(shù)據(jù)類型名n成員名n;}變量名列表;structchild{charinitial; intage; intgrade; }boy,girl;例:第八頁,共六十頁,編輯于2023年,星期一結構體的定義3.直接定義結構體變量,如:

變量只能定義一次struct{

數(shù)據(jù)類型名1成員名1;

……

數(shù)據(jù)類型名n成員名n;}變量名列表;struct{charinitial; intage; intgrade; }boy,girl;第九頁,共六十頁,編輯于2023年,星期一【例10.1】結構體變量的定義與使用2structchild3{charinitial; intage; 6 intgrade; 7};struct

是關鍵字,表示是結構體類型。child是結構體類型名。結構體中的各個成員,形式:

類型符成員名

可以是基本型或構造型第十頁,共六十頁,編輯于2023年,星期一8voidmain()9{10 structchildboy,girl,copyboy;11 boy.initial='R';12 boy.age=15;13 boy.grade=75;14 girl.age=boy.age-1; /*sheisoneyearyounger*/girl.grade=82;girl.initial='H';17 copyboy=boy; /*copyboy'sdatatocopyboy*/18 printf("girl:%cis%dyearsoldandgotagradeof%d\n",19 girl.initial,girl.age,girl.grade);20 printf("boy:%cis%dyearsoldandgotagradeof%d\n",21 boy.initial,boy.age,boy.grade);22 printf("copyboy:%cis%dyearsoldandgotagradeof%d\n",23 copyboy.initial,copyboy.age,copyboy.grade);24 }程序運行結果如下:girl:His14yearsoldandgotagradeof82boy:Ris15yearsoldandgotagradeof75copyboy:Ris15yearsoldandgotagradeof75定義了3個結構體類型的變量先定義結構體類型再定義變量名第十一頁,共六十頁,編輯于2023年,星期一幾點說明:(1)結構體類型與結構體變量概念不同

類型:不分配內(nèi)存;

變量:分配內(nèi)存

類型:不能賦值、存取、運算;

變量:可以(2)結構體可以嵌套

(3)結構類型中的成員名,可以與程序中的變量同名,它們代表不同的對象,互不干擾

structchildboy;intage;(4)結構體類型及變量的作用域和生存期與基本類型變量相同例:

structdate{intmonth;intday;intyear;};structstudent{intnum;charname[20];

structdatebirthday;}stu;numnamebirthdaymonthdayyearstructPoint{intx,y;};structImg{inttag;structImg*pimg;//正確,可以包含自身類型的指針

structImgimg;//錯誤,不能包含自身類型的變量};第十二頁,共六十頁,編輯于2023年,星期一結構體類型變量的初始化

和其它變量一樣,在定義結構體變量時賦初值struct[結構體類型名]{數(shù)據(jù)類型名1成員名1;……數(shù)據(jù)類型名n成員名n;}結構體變量={初始數(shù)據(jù)};第十三頁,共六十頁,編輯于2023年,星期一【例10.2】結構體變量的初始化1 #include<stdio.h>2 voidmain()3 {4 struct5 {6 charinitial;7 intage;8 intgrade;9 }boy={'A',15,90};10 printf("%cis%dyearsoldandgotagradeof%d\n",11 boy.initial,boy.age,boy.grade);12 }程序運行結果是:Ais15yearsoldandgotagradeof90第十四頁,共六十頁,編輯于2023年,星期一2.結構體數(shù)組與指針

結構體數(shù)組:數(shù)組中每個元素都是一個結構體類型的數(shù)據(jù)。結構體數(shù)組的定義

與定義結構體變量相似,只需說明其為數(shù)組即可。三種形式:

后定義同時定義直接定義第十五頁,共六十頁,編輯于2023年,星期一后定義structchild{charinitial; intage; intgrade; }structchildboy[30];同時定義structchild{charinitial; intage; intgrade; }boy[30];直接定義struct{charinitial; intage; intgrade; }boy[30];結構體數(shù)組的定義第十六頁,共六十頁,編輯于2023年,星期一后定義structchild{charinitial; intage; intgrade; };structchildboy[2]={{‘a(chǎn)’,5,3},{‘b’,4,2}};同時定義structchild{charinitial; intage; intgrade; }

boy[2]={{‘a(chǎn)’,5,3},{‘b’,4,2}};直接定義struct{charinitial; intage; intgrade; }

boy[2]={{‘a(chǎn)’,5,3},{‘b’,4,2}};結構體數(shù)組的初始化在定義數(shù)組的后面加上:

={初值表列};第十七頁,共六十頁,編輯于2023年,星期一結構體數(shù)組的引用引用方式:結構體數(shù)組名[下標].成員名structchild{charinitial; intage; intgrade; };structchildboy[2]={{‘a(chǎn)’,5,3},{‘b’,4,2}};boy[1].age++;printf(“%d”,boy[1].age)第十八頁,共六十頁,編輯于2023年,星期一結構體指針定義struct結構體名*結構體指針名;例structchild*p;存放結構體變量在內(nèi)存的起始地址structchild{charinitial; intage; intgrade; }boy;structchild*p=&boyinitialagegradeboyp第十九頁,共六十頁,編輯于2023年,星期一結構體指針的引用(*結構體指針名).成員名結構體指針名->成員名結構體變量名.成員名指向運算符優(yōu)先級:1結合方向:從左向右例intn;int*p=&n;

*p=10;n=10structstudentstu1;structstudent*p=&stu1;stu1.num=101;

(*p).num=101第二十頁,共六十頁,編輯于2023年,星期一【例10.3】結構體數(shù)組和指針的使用1 #include<stdio.h>2 voidmain()3 {4 struct5 {6 charinitial;7 intage;8 intgrade;9 }kids[8],*point;10 intindex;11 for(index=0;index<8;index++)12 {13 point=kids+index;14 point->initial='A'+index;15 point->age=16;16 point->grade=87;17 }結構體數(shù)組的定義結構體指針的定義結構體指針的初始化第二十一頁,共六十頁,編輯于2023年,星期一18 kids[3].age=kids[5].age=17;19 kids[2].grade=kids[6].grade=92;20 kids[4].grade=57;21 for(index=0;index<8;index++)22 {23 point=kids+index;24 printf("%cis%dyearsoldandgotagradeof%d\n",25 (*point).initial,kids[index].age,26 point->grade);27 }}運行結果如下:Ais16yearsoldandgotagradeof87Bis16yearsoldandgotagradeof87Cis16yearsoldandgotagradeof92Dis17yearsoldandgotagradeof87Eis16yearsoldandgotagradeof57Fis17yearsoldandgotagradeof87Gis16yearsoldandgotagradeof92His16yearsoldandgotagradeof87結構體指針的引用結構體數(shù)組的引用第二十二頁,共六十頁,編輯于2023年,星期一第二十三頁,共六十頁,編輯于2023年,星期一

3.結構體的嵌套與指針成員結構體嵌套是指結構體的數(shù)據(jù)成員仍然是結構體類型。引用:需要按照結構體成員的訪問方法。例:

structdate{intmonth;intday;intyear;};structstudent{intnum;charname[20];

structdatebirthday;}stu;numnamebirthdaymonthdayyearstu.birthday.year++;第二十四頁,共六十頁,編輯于2023年,星期一【例10.4】嵌套結構體的定義與訪問1 #include<stdio.h>2 voidmain()3 {4 structperson{5 charname[25];6 intage;7 charstatus;/*M=married,S=single*/8 };9 structalldat{10 intgrade;11 structpersondescrip;12 charlunch[25];13 }student[3];14 structalldatteacher;15 inti;16 teacher.grade=94;17 teacher.descrip.age=34;18 teacher.descrip.status='M';19 strcpy(,"MarySmith");20 strcpy(teacher.lunch,"BaloneySandwich");定義person結構體定義alldat結構體

嵌套結構體的訪問

第二十五頁,共六十頁,編輯于2023年,星期一21 for(i=0;i<=2;i++)22 {23 student[i].descrip.age=15;24 student[i].descrip.status='S';25 strcpy(student[i].lunch,"PeanutButter");26 student[i].grade=77;27 }28 student[1].grade=87;29 student[1].descrip.age=14;30 strcpy(student[0].,"ToddWhite");31 strcpy(student[1].,"PeterBush");32 strcpy(student[2].,"TigerBlack");33 printf("thestatusoftheteacherandstudents:\n");34 printf("name \tage\tstatus\tgrade\t lunch\n");35printf("===========================\n");第二十六頁,共六十頁,編輯于2023年,星期一36 printf("%10s\t%d\t%c\t%d\t%10s\n",37 ,38 teacher.descrip.age,39 teacher.descrip.status,40 teacher.grade,41 teacher.lunch);42 for(i=0;i<=2;i++)43 printf("%s\t%d\t%c\t%d\t%s\n",44 student[i].,45 student[i].descrip.age,46 student[i].descrip.status,47 student[i].grade,48 student[i].lunch);49 }────────────────────────────────運行結果如下:thestatusoftheteacherandstudents:name age status grade lunch=====================================================MarySmith 34 M 94 BaloneySandwichToddWhite 15 S 77 PeanutButterPeterBush 14 S 87 PeanutButterTigerBlack 15 S 77 PeanutButter第二十七頁,共六十頁,編輯于2023年,星期一結構體的數(shù)據(jù)成員是指針類型時,1.指針類型的成員變量要賦值時需分配內(nèi)存空間2.如果變量的空間分配通過內(nèi)存分配函數(shù)完成,最后還要釋放這塊內(nèi)存區(qū)域。

C語言提供了相關的存儲管理庫函數(shù)。這里僅介紹其中三個,它們的原型說明在“stdlib.h”頭文件和“alloc.h”頭文件中,使用這三個函數(shù)時,應選擇其中一個頭文件包含到源程序中。⑴動態(tài)分配存儲區(qū)函數(shù)malloc()

函數(shù)原型:void

*malloc(unsignedsize);

調(diào)用格式:malloc(size)

功能:在內(nèi)存分配一個size字節(jié)的存儲區(qū)。調(diào)用

結果為新分配的存儲區(qū)的首地址,是一個void

類型指針。若分配失敗,則返回NULL(即0)。第二十八頁,共六十頁,編輯于2023年,星期一⑵動態(tài)分配存儲區(qū)函數(shù)calloc()

函數(shù)原型:

void

*calloc(unsignedintn,unsignedintsize);

調(diào)用格式:calloc(n,size)

功能:在內(nèi)存分配一個n倍size字節(jié)的存儲區(qū)。

調(diào)用結果為新分配的存儲區(qū)的首地址,是一個void

類型指針。若分配失敗,則返回NULL(即0)。第二十九頁,共六十頁,編輯于2023年,星期一⑶釋放動態(tài)分配存儲區(qū)函數(shù)free()

函數(shù)原型:void

free(void*p);此函數(shù)無返回值實參必須是一個指向動態(tài)分配存儲區(qū)

的指針,它可以是任何類型的指針變量。調(diào)用格式:free(p)功能:釋放p所指向的動態(tài)分配的存儲區(qū)。第三十頁,共六十頁,編輯于2023年,星期一【例10.5】指針類型結構體成員變量1voidmain()2{3 structperson{4 char*name;5 intage;6 charstatus; /*M=married,S=single*/7 };8 structpersonstudent,teacher,*point;9 point=malloc(sizeof(structperson)); /*allocatememoryforthepoint*/10 printf("student'saddressis:%ld\n",&student);11 printf("teacher'saddressis:%ld\n",&teacher);12 printf("pointispointedtoaddress:%ld\n",point);13 printf("------beforeallocatememory------\n");14 printf("student'snameispointedtoaddress:%ld\n",);15 printf("teacher'snameispointedtoaddress:%ld\n",);16 printf("pointpointednameispointedtoaddress:%ld\n",point->name);

指針類型的結構體數(shù)據(jù)成員

動態(tài)分配內(nèi)存空間第三十一頁,共六十頁,編輯于2023年,星期一17 =malloc(sizeof(char)*10);/*allocate10bytesforthename*/18 strcpy(,"PeterNixon");19 student.age=20;20 student.status='S';21 =malloc(sizeof(char)*10);/*allocate10bytesforthename*/22 strcpy(,"DanBush");23 teacher.age=36;24 teacher.status='M';25 point->name=malloc(sizeof(char)*10);/*allocate10bytesforthename*/26 strcpy(point->name,"TomBlack");27 point->age=26;28 point->status='M';

第三十二頁,共六十頁,編輯于2023年,星期一29 printf("------afterallocatememory------\n");30 printf("student'snameispointedtoaddress:%ld\n",);31 printf("teacher'snameispointedtoaddress:%ld\n",);32 printf("pointpointednameispointedtoaddress:%ld\n",point->name);33 printf("name\tage\tstatus\n");34 printf("==================================\n");35 printf("%s\t%d\t\%c\n",,student.age,student.status);36 printf("%s\t%d\t\%c\n",,teacher.age,teacher.status);37 printf("%s\t%d\t\%c\n",point->name,point->age,point->status);38 free();39 free();40 free(point->name);41 free(point);42 }釋放內(nèi)存空間第三十三頁,共六十頁,編輯于2023年,星期一程序的運行結果如下:student'saddressis:98697156teacher'saddressis:98697162pointispointedtoaddress:98634946------beforeallocatememory------student'snameispointedtoaddress:98631680teacher'snameispointedtoaddress:98631680pointpointednameispointedtoaddress:98631680------afterallocatememory------student'snameispointedtoaddress:98634962teacher'snameispointedtoaddress:98634978pointpointednameispointedtoaddress:98634994name age status==================================PeterNixon 20 SDanBush 36 MTomBlack 26 M第三十四頁,共六十頁,編輯于2023年,星期一

4.鏈表

鏈表是一種動態(tài)數(shù)據(jù)結構,可根據(jù)需要動態(tài)地分配存儲單元。在數(shù)組中,插入或刪除一個元素都比較繁瑣,而用鏈表則相對容易。但是數(shù)組元素的引用比較簡單,對于鏈表中結點數(shù)據(jù)的存取操作則相對復雜。

第三十五頁,共六十頁,編輯于2023年,星期一鏈表的基本結構數(shù)據(jù)指針數(shù)據(jù)前指針后指針1)鏈表中每個元素稱為一個結點。2)構成鏈表的結點必須是結構體類型數(shù)據(jù)。3)相鄰結點的地址不一定是連續(xù)的, 依靠指針將它們連接起來。第三十六頁,共六十頁,編輯于2023年,星期一單向鏈表中的節(jié)點可以用一個結構體類型來定義,其形式為:

struct節(jié)點結構體類型名{

數(shù)據(jù)成員定義;

struct節(jié)點結構體類型名

*指針變量名;};單向鏈表中節(jié)點的定義例:structchild{intnum;structchild*next;};typedefstructchildNODE;

第三十七頁,共六十頁,編輯于2023年,星期一鏈表的基本操作:建立:根據(jù)需要一個一個地開辟新結點,在結點中存放數(shù)據(jù)并建立結點間的鏈接關系。查找:根據(jù)節(jié)點的數(shù)據(jù)部分與要找的數(shù)據(jù)比較而得。刪除:將前后節(jié)點指針調(diào)整后,釋放要刪除節(jié)點的內(nèi)存即可。插入:根據(jù)新插入節(jié)點的數(shù)值,確定要插入的位置,調(diào)整前后節(jié)點的指針完成。第三十八頁,共六十頁,編輯于2023年,星期一q【例】建立一個學生電話簿

的單向鏈表函數(shù)。1.建立單向鏈表頭指針h設為NULL讀入一個學生姓名當姓名長度不為0

開辟新結點p=NEWstrcpy(p->name,name)gets(p->tel)p->next=NULLh==NULLTFh指向第一個連接新結點結點h=pq->next=pq指向新的尾結點q=p

讀入一個學生姓名圖9.3建立單向鏈表NULLhpChang62783410NULLWang63212986NULLpq

第三十九頁,共六十頁,編輯于2023年,星期一在鏈表中,如果要刪除第i個結點,一般是將第(i-1)結點直接與第(i+1)個結點相連接,然后再釋放第i個結點的存儲單元。2.刪除單向鏈表中指定的結點hNULL第i-1個結點第i個結點第i+1個結點

第四十頁,共六十頁,編輯于2023年,星期一【例】刪除學生電話簿鏈

表中指定學生的信息。

p=headwhile(strcmp(x,p->name)!=0&&p->next!=NULL)q指針跟隨p指針后移查找(q=p;p=p->next;)strcmp(x,p->name)==0TFp==headTFhead=p->nextq->next=p->next沒找到

free(p)

刪除鏈表中指定結點的N-S圖刪除

第一個結點

刪除中間結點或尾結點

刪除結點工

作分兩步:查找結點刪除結點學生姓名當姓名不同并且不是尾結點循環(huán)第四十一頁,共六十頁,編輯于2023年,星期一將一個新結點插入到鏈表中,首先要尋找插入的位置。如果要求在第i個結點前插入,可設置三個工作指針p0、p和q,p0是指向待插入結點的指針。利用p和q指針查找第i個結點,找到后再將新結點鏈接到鏈表上。3.在單向鏈表中插入結點hNULL第i個結點ppqqp0p新的第i個結點第四十二頁,共六十頁,編輯于2023年,星期一

head==NULLTFp=headhead=p0while(strcmp(x,p->name)!=0&&p->next!=NULL)p0->nextq指針跟隨p指針后移查找(q=p;p=p->next;)=NULLstrcmp(x,p->name)==0TFp==headTFp->next=p0head=p0q->next=p0p0->next=NULLp0->next=p

在鏈表指定位置前插入結點的N-S圖【例】在學生電話簿鏈表中插入一個學生的信息。要求將新的信息插入在指定學生信息之前,如果未找到指定學生,則追加在鏈表尾部。當姓名不同并且不是尾結點循環(huán)空表時

插入

結點在表尾

追加結點

插入結點工

作分兩步:查找插

入位置連接

新結點在表頭

插入結點

在表中間

插入結點

第四十三頁,共六十頁,編輯于2023年,星期一【例10.6】單向鏈表1 #include"stdio.h" /*thisisneededonlytodefinetheNULL*/2 #include"stdlib.h" /*thisisneededforthefunctionitoa()*/3 #include"string.h" /*thisisneededforthefunctionstrcpy()*/4 #defineRECORDS35 voidmain()6 {7 structanimal8 {9 charname[25]; /*Theanimalsname*/10 charbreed[25]; /*Thetypeofanimal*/11 intage; /*Theanimalsage*/12 structanimal*next;/*apointertoanotherrecordofthistype*/13 }*point,*start,*prior; /*thisdefines3pointers,novariables*/14 intindex;15 chartemp[5];16 /*thefirstrecordisalwaysaspecialcase*/17 start=(structanimal*)malloc(sizeof(structanimal));18 strcpy(start->name,"general");19 strcpy(start->breed,"MixedBreed");20 start->next=NULL;第四十四頁,共六十頁,編輯于2023年,星期一21 prior=start;22 /*aloopcanbeusedtofillintherestonceitisstarted*/23 for(index=0;index<RECORDS;index++)24 {25 point=(structanimal*)malloc(sizeof(structanimal));26 strcpy(point->name,"Frank");27 strcat(point->name,itoa(index,temp,10));28 strcpy(point->breed,"LaboradorRetriever");29 point->age=index;30 prior->next=point;/*pointlast"next"tothisrecord*/31 point->next=NULL;/*pointthis"next"toNULL*/32 prior=point; /*thisisnowthepriorrecord*/33 }34 /*nowprintoutthedatadescribedabove*/35 point=start;36 do37 {38 prior=point->next;39 printf("%sisa%s,andis%dyearsold.\n",point->name,40 point->breed,point->age);建立鏈表遍歷鏈表,輸出每個節(jié)點的信息第四十五頁,共六十頁,編輯于2023年,星期一41 point=point->next;42 }while(prior!=NULL);43 /*goodprogrammingpracticedictatesthatwefreeupthe*/44 /*dynamicallyallocatedspacebeforewequit*/45 point=start; /*firstblockofgroup*/46 do47 {48 prior=point->next; /*nextblockofdata*/49 free(point); /*freepresentblock*/50 point=prior; /*pointtonext*/51 }while(prior!=NULL); /*quitwhennextisNULL*/52 }──────────────────────────────────────運行結果如下:generalisaMixedBreed,andis0yearsold.Frank0isaLaboradorRetriever,andis0yearsold.Frank1isaLaboradorRetriever,andis1yearsold.Frank2isaLaboradorRetriever,andis2yearsold.遍歷鏈表,釋放動態(tài)生成的空間第四十六頁,共六十頁,編輯于2023年,星期一10.3共用體共用體(Union)是將不同的數(shù)據(jù)類型組合在一起,共同占用同一段內(nèi)存的用戶自定義數(shù)據(jù)類型。共用體的聲明方法與結構體類似,只是將關鍵字struct改為了union。定義共用體類型變量的一般形式為

union共用體名第四十七頁,共六十頁,編輯于2023年,星期一10.3共用體構造數(shù)據(jù)類型,也叫共用體

用途:使幾個不同類型的變量共占一段內(nèi)存(相互覆蓋)1、聯(lián)合體類型的定義

union[聯(lián)合體類型名]{

數(shù)據(jù)類型名1成員名1;數(shù)據(jù)類型名2成員名2;

……

數(shù)據(jù)類型名n成員名n;};類型定義不分配內(nèi)存共占4字節(jié)sizeof(unionUData)=sizeof(f)聯(lián)合體的大小是成員中占內(nèi)存最大的成員的大小

由于共享的特性,只有最新存儲的數(shù)據(jù)是有效的。第四十八頁,共六十頁,編輯于2023年,星期一共同體與結構體的異同共同體與結構體都是由多個成員分量組成的一個整體;共同體與結構體在定義、說明和使用(成員引用、指針)上十分相似。結構體:多個成員分量分別占用不同的存儲空間構成一個整體;成員分量之間是相互獨立的,所進行的各種操作互不影響。共同體:多個成員分量共同占用同一存儲空間;成員分量之間是相互聯(lián)系的,所進行的操作相互依賴。第四十九頁,共六十頁,編輯于2023年,星期一【例10.7】共用體1voidmain()2{3 union4 {5 intvalue; 6 struct7 {8 charfirst; 9 charsecond;10 }half;11 }number;12 number.value=0x4241; /*assignvaluetothefirstpartofunion*/13 printf("%c%c\n", /*meansthesecondpartisalsochanged*/14 number.half.first,number.half.second);15 number.half.first='a'; /*assignvaluetothesecondpartofunion*/16 number.half.second='b'; /*meansthefirstpartisalsochanged*/17 printf("%x\n",number.value);18 getch();19}──────────────────────────────────────程序的運行結果為:AB6261結構體的定義及變量聲明共同體的定義及變量聲明Value與half共用一個存儲空間第五十頁,共六十頁,編輯于2023年,星期一用戶自定義類型

標準類型(如int、char、long、double等):系統(tǒng)已經(jīng)定義好的數(shù)據(jù)類型,用戶可以直接使用,無須再進行定義。

用戶自定義類型:用戶根據(jù)自己的實際要求,自己定義的新的數(shù)據(jù)類型。 除結構、共同體等類型之外,還可以用類型說明語句typedef定義新的類型說明符來代替已有的類型。10.4用typedef定義數(shù)據(jù)類型第五十一頁,共六十頁,編輯于2023年,星期一typedef語句的一般形式typedef

已定義的類型新的類型說明符例如:

typedefintINTEGER;

typedeffloatREAL;

typedefstruct { intmonth; intday; intyear; }DATE;

在具有上述typedef語句的程序中,下列語句就是等價的:

intiValue;floatrValue

;DATEbirthDay

等價于INTEGERiValue;REALrValue;DATEbirthDay;

不能寫成tructDATEbirthDay

第五十二頁,共六十頁,編輯于2023年,星期一【例10.8】設有一個教師與學生通用的表格,教師數(shù)據(jù)有姓名、年齡、職業(yè)、辦公室四項。學生有姓名、年齡、職業(yè)、班級四項。其中,學生的職業(yè)為“S”,教師職業(yè)為“T”。1 voidmain()2 {3 typedefstruct4 {5 charname[20];6 intage;7 charjob;8 union9 {10 intclass;11 charoffice[20];12 }depa;13 }PERSON;14 PERSONbody[2];15 inti;第五十三頁,共六十頁,編輯于2023年,星期一16 strcpy(body[0].name,"BillChan");17 strcpy(body[1].name,"RobertWilson");18 body[0].age=18;19 body[1].age=38;20 body[0].job='S';21 body[1].job='T';22 body[0].depa.class=2;23 strcpy(body[1].depa.office,"B1-101");printf("name \tage\tjob\tclass/office\n")

溫馨提示

  • 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. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論