C語言程序設計教程第9章結構體與共用體.ppt
《C語言程序設計教程第9章結構體與共用體.ppt》由會員分享,可在線閱讀,更多相關《C語言程序設計教程第9章結構體與共用體.ppt(86頁珍藏版)》請在裝配圖網上搜索。
1,第9章結構體與共用體,北京科技大學計算機系,C語言程序設計,2020/4/25,2,第9章結構體與共用體,9.1結構體9.2共用體9.3枚舉類型與類型命名,2020/4/25,3,一個學生的信息有學號、姓名、性別、年齡、住址、成績等。一本圖書的信息有分類編號、書名、作者、出版社、出版日期、價格、庫存量等。如何描述這些類型不同的相關數據?,9.1結構體,9.1.1結構體與結構體類型的定義,?,信息管理,結構體一種構造類型數據結構體由若干不同類型的數據項組成,構成結構體的各個數據項稱為結構體成員。,2020/4/25,4,struct結構體名數據類型1成員名1;數據類型2成員名2;數據類型n成員名n;,9.1結構體,9.1.1結構體與結構體類型的定義,結構體類型定義的一般形式:,struct為關鍵字;結構體名是用戶定義的類型標識。中是組成該結構體的成員。成員的數據類型可以是C語言所允許的任何數據類型。,2020/4/25,5,例如圖書類型的定義:structbookcardcharnum10;/*圖書分類編號是字符數組類型*/charname30;/*書名是字符數組類型*/charauthor30;/*作者是字符數組類型*/charpublisher60;/*出版社是字符數組類型*/floatprice;/*價格是單精度實型*/intn;/*庫存量是整型*/;,例如學生類型的定義:structstudentcharnum8;/*學號是字符數組類型*/charname30;/*姓名是字符數組類型*/charsex;/*性別是字符型*/intage;/*年齡是整型*/charaddr60;/*住址是字符數組類型*/intscore6;/*成績是整型數組類型*/;,9.1結構體,9.1.1結構體與結構體類型的定義,2020/4/25,6,9.1結構體,9.1.2結構體變量的定義與初始化,1.結構體類型變量的定義,利用已定義的結構體類型名定義變量struct結構體名變量名表;例如:structbookcardbook1100;structstudents30,t1,t2;,按照結構體類型的組成,系統(tǒng)為定義的結構體變量分配內存單元。結構體變量的各個成員在內存中占用連續(xù)存儲區(qū)域,結構體變量所占內存大小為結構體中每個成員所占用內存的長度之和。,2020/4/25,7,9.1結構體,結構體類型與變量的說明,類型與變量是不同的概念。應先定義一個結構體類型,而后再定義結構體變量。系統(tǒng)對類型不分配空間,僅對變量分配空間。只能對變量賦值、存取或運算,而不能對一個類型賦值、存取或運算。,成員也可以是結構變量。,對結構中的成員,可以單獨使用,它的作用與地位相當于普通變量。成員名可與程序中的變量名相同時,也可與不同結構體類型的成員名相同,二者代表不同的對象。,structdateintyear,month,day;structstudentcharnum8;charname30;charsex;structdatebirthday;/*成員為結構體類型*/charaddr60;intscore6;,2020/4/25,8,9.1結構體,9.1.2結構體變量的定義與初始化,1.結構體類型變量的定義,在定義結構體類型的同時定義變量,例如:structstudentcharnum8,name20,sex;intage;floatscore;st30;,struct結構體名成員定義表;變量名表;,2020/4/25,9,9.1結構體,9.1.2結構體變量的定義與初始化,1.結構體類型變量的定義,直接定義結構體類型變量,例如:structcharnum8,name20,sex;intage;floatscore;st30,a,b,c;,struct成員定義表;變量名表;,2020/4/25,10,9.1結構體,9.1.2結構體變量的定義與初始化,2.結構體變量的初始化,【例9.4】結構體變量的初始化。structdateintyear,month,day;structstudentcharnum8,name20,sex;structdatebirthday;floatscore;a=9606011,Liming,M,1977,12,9,83,b=9608025,Zhangliming,F,1978,5,10,87,c;,如果初值個數少于結構體成員個數,則將無初值對應的成員賦以0值。如果初值個數多于結構體成員個數,則編譯出錯。,2020/4/25,11,9.1結構體,9.1.2結構體變量的定義與初始化,2.結構體變量的初始化,【例9.5】結構體數組的初始化。structscharnum8,name20,sex;floatscore;stu3=9606011,Liming,M,87.5,9606012,Zhangjiangguo,M,79,9606013,Wangping,F,90;,元素的個數可以省略,根據賦初值時結構體常量的個數確定數組元素的個數,2020/4/25,12,9.1結構體,9.1.2結構體變量的定義與初始化,3.結構體變量的運算,用sizeof運算符計算結構體變量所占內存空間,structdateintyear,month,day;structstudentcharnum8,name20,sex;structdatebirthday;floatscore;a;,sizeof(a)的結果為8+20+1+6+4=39sizeof(structstudent)的結果為39,2020/4/25,13,9.1結構體,9.1.2結構體變量的定義與初始化,3.結構體變量的運算,同類型結構體變量之間的賦值運算,結構體變量之間進行賦值時,系統(tǒng)將按成員一一對應賦值。,structdateintyear,month,day;structstudentcharnum8,name20,sex;structdatebirthday;floatscore;a=9606011,Liming,M,1977,12,9,83,b,c;c=a;,2020/4/25,14,9.1結構體,9.1.2結構體變量的定義與初始化,3.結構體變量的運算,對結構體變量進行取址運算,structdateintyear,month,day;structstudentcharnum8,name20,sex;structdatebirthday;floatscore;a;,對結構體變量a進行;structstudentcharnum8,name20,sex;structdatebirthday;floatscore;a;,“.”是分量運算符,運算級別最高。,a.birthday.yeara.birthday.montha.birthday.day,結構體變量的各個成員可進行何種運算,由該成員的數據類型決定,2020/4/25,16,9.1結構體,9.1.2結構體變量的定義與初始化,【例9.6】編寫一個統(tǒng)計選票的程序。structcandidatecharname20;/*name為候選人姓名*/intcount;/*count為候選人得票數*/list=invalid,0,Zhao,0,Qian,0,Sun,0,Li,0,Zhou,0;,2020/4/25,17,9.1結構體,9.1.2結構體變量的定義與初始化,main()inti,n;printf(Entervoten);scanf(%d,/*輸入所投候選人編號*/,2020/4/25,18,9.1結構體,9.1.2結構體變量的定義與初始化,for(i=1;iyearp-monthp-day,“-”是指向結構體成員運算符,優(yōu)先級為一級,p=today,*p=,2020/4/25,22,9.1結構體,9.1.3結構體的指針,3.指向結構體數組的指針,【例9.7】利用結構體指針輸出一組化學元素名稱及其原子量。structlistinti;charname4;floatw;tab4=1,H,1.008,2,He,4.0026,3,Li,6.941,4,Be,9.01218;,2020/4/25,23,9.1結構體,9.1.3結構體的指針,3.指向結構體數組的指針,main()structlist*p;printf(NotNametAtomicWeightn);for(p=tab;pi,p-name,p-w);,NoNameAtomicWeight,1H1.008,2He4.0026,3Li6.941,4Be9.01218,2020/4/25,24,9.1結構體,9.1.3結構體的指針,【例9.8】分析自增自減運算對程序結果的影響。structcodeinti;charc;a=100,A,200,B,300,C,400,D;,2020/4/25,25,9.1結構體,9.1.3結構體的指針,main()structcode*p=a;printf(%dt,+p-i);printf(%ct,(+p)-c);printf(%dt,(p+)-i);printf(%ct,+p-c);printf(%dt,p-i+);printf(%dn,p-i);,p,101,D,301,101,B,200,D,300,301,2020/4/25,26,9.1結構體,9.1.4函數間結構體數據的傳遞,方法一:在函數之間直接傳遞結構體數據。函數的形參定義為結構體變量。函數調用時,可將主調函數的結構體類型實參傳遞給被調函數的形參。如果將函數定義為結構體類型函數,可利用return語句將一個結構體數據結果返回到主調函數中。,2020/4/25,27,9.1結構體,9.1.4函數間結構體數據的傳遞,方法二:在函數之間傳遞結構體指針。形參定義為指向結構體類型的指針變量,可將主調函數的結構體指針傳遞給被調函數的形參變量,通過指針形參的指向域的擴展,操作主調函數中結構體變量及其成員。如果將函數定義為結構體指針型函數,可利用return語句將被調函數中結構體變量的指針返回給主調函數的結構體指針變量。方法三:利用全局結構體變量傳遞結構體數據。,2020/4/25,28,9.1結構體,9.1.4函數間結構體數據的傳遞,【例9.9】編制一個復數乘法函數,采用值傳遞的方法傳送數據。structcomplex/*定義存放復數的結構體類型*/floatre;/*re成員用于存放復數的實部*/floatim;/*im成員用于存放復數的虛部*/;,2020/4/25,29,9.1結構體,9.1.4函數間結構體數據的傳遞,structcomplexmultiplier(structcomplexcx,structcomplexcy)structcomplexcz;cz.re=cx.re*cy.re-cx.im*cy.im;cz.im=cx.re*cy.im+cx.im*cy.re;return(cz);,形參是結構體變量。調用此函數時,系統(tǒng)將分別為形參cx和cy各分配一個sizeof(structcomplex)大小的內存空間,每個成員都要一一傳遞。,2020/4/25,30,9.1結構體,9.1.4函數間結構體數據的傳遞,main()structcomplexx,y,z;x.re=3.2;x.im=1.5;y.re=2.7;y.im=4.6;z=multiplier(x,y);printf(%f+%fin,z.re,z.im);/*以復數形式輸出*/,2020/4/25,31,9.1結構體,9.1.4函數間結構體數據的傳遞,【例9.10】編制一個復數乘法函數,采用傳遞指針的方法達到傳送數據的目的。structcomplexfloatre,im;voidmultiplier(structcomplex*px,structcomplex*py,structcomplex*pz)pz-re=px-re*py-re-px-im*py-im;pz-im=px-re*py-im+px-im*py-re;,形參定義為指針型參數。函數調用時,實參傳遞的是結構體指針(地址),因此形參px、py可讀取主調函數中變量的內容,乘積結果也可通過形參pz指針存到主調函數中的目標變量。這樣實參與形參之間的數據傳遞由多值(每個成員的值)變成了單值(結構體變量的首地址)。,2020/4/25,32,9.1結構體,9.1.4函數間結構體數據的傳遞,main()structcomplexx,y,z;x.re=3.2;x.im=1.5;y.re=2.7;y.im=4.6;multiplier(,2020/4/25,33,鏈表是一種動態(tài)數據結構,可根據需要動態(tài)地分配存儲單元。在數組中,插入或刪除一個元素都比較繁瑣,而用鏈表則相對容易。但是數組元素的引用比較簡單,對于鏈表中結點數據的存取操作則相對復雜。,9.1結構體,9.1.5結構體的應用鏈表,鏈表中每個元素稱為一個結點。構成鏈表的結點必須是結構體類型數據。,1.鏈表的基本結構,相鄰結點的地址不一定是連續(xù)的,依靠指針將它們連接起來。,structnodecharc;structnode*next;,2020/4/25,34,C語言提供了相關的存儲管理庫函數。這里僅介紹其中三個,它們的原型說明在“stdlib.h”頭文件和“alloc.h”頭文件中,使用這三個函數時,應選擇其中一個頭文件包含到源程序中。,動態(tài)分配存儲區(qū)函數malloc()函數原型:void*malloc(unsignedsize);調用格式:malloc(size)功能:在內存分配一個size字節(jié)的存儲區(qū)。調用結果為新分配的存儲區(qū)的首地址,是一個void類型指針。若分配失敗,則返回NULL(即0)。,9.1結構體,9.1.5結構體的應用鏈表,2.動態(tài)分配和釋放存儲單元,在ANSIC標準中,關鍵字void有兩種用法。第一種用法,可將無返回值的函數定義為void類型第二種用法,用void*定義指針,這是一個指向非具體數據類型的指針,稱為無類型指針。,2020/4/25,35,【例9.11】調用malloc函數分配所需存儲單元。#includemain()structstintn;structst*next;*p;p=(structst*)malloc(sizeof(structst);p-n=5;p-next=NULL;printf(p-n=%dtp-next=%xn,p-n,p-next);,9.1結構體,9.1.5結構體的應用鏈表,2.動態(tài)分配和釋放存儲單元,將函數返回值轉換成結構體指針,2020/4/25,36,動態(tài)分配存儲區(qū)函數calloc()函數原型:void*calloc(unsignedintn,unsignedintsize);調用格式:calloc(n,size)功能:在內存分配一個n倍size字節(jié)的存儲區(qū)。調用結果為新分配的存儲區(qū)的首地址,是一個void類型指針。若分配失敗,則返回NULL(即0)。,9.1結構體,9.1.5結構體的應用鏈表,2.動態(tài)分配和釋放存儲單元,2020/4/25,37,【例9.12】調用calloc函數分配所需存儲單元。#includemain()inti,*ip;ip=(int*)calloc(10,2);for(i=0;itel);p-next=NULL;if(h=NULL)/*h為空,表示新結點為第一個結點*/h=p;/*頭指針指向第一個結點*/else/*h不為空*/q-next=p;/*新結點與尾結點相連接*/q=p;/*使q指向新的尾結點*/printf(name:);gets(name);returnh;,structnode*create()staticstructnode*h;structnode*p,*q;charname20;h=NULL;printf(name:);gets(name);while(strlen(name)!=0)/*當輸入的姓名不是空串循環(huán)*/p=NEW;/*開辟新結點*/if(p=NULL)/*p為NULL,新結點分配失敗*/printf(Allocationfailuren);exit(0);/*結束程序運行*/,#include#include#defineNEW(structnode*)malloc(sizeof(structnode)structnodecharname20,tel9;structnode*next;,9.1結構體,9.1.5結構體的應用鏈表,main()structnode*head;head=create();,2020/4/25,41,【例9.14】輸出學生電話簿鏈表函數。,9.1結構體,9.1.5結構體的應用鏈表,4.輸出單向鏈表中各結點信息,2020/4/25,42,voidprlist(structnode*head)structnode*p;p=head;while(p!=NULL)printf(%st%sn,p-name,p-tel);p=p-next;,#include#include#defineNEW(structnode*)malloc(sizeof(structnode)structnodecharname20,tel9;structnode*next;,9.1結構體,9.1.5結構體的應用鏈表,main()structnode*head;head=create();prlist(head);,2020/4/25,43,在鏈表中,如果要刪除第i個結點,一般是將第(i-1)個結點直接與第(i+1)個結點相連接,然后再釋放第i個結點的存儲單元。,9.1結構體,9.1.5結構體的應用鏈表,5.刪除單向鏈表中指定的結點,2020/4/25,44,【例9.15】刪除學生電話簿鏈表中指定學生的信息。,9.1結構體,9.1.5結構體的應用鏈表,刪除第一個結點,刪除中間結點或尾結點,學生姓名,當姓名不同并且不是尾結點循環(huán),2020/4/25,45,【例9.15】刪除學生電話簿鏈表中指定學生的信息。,9.1結構體,9.1.5結構體的應用鏈表,(a)刪除第一個結點(head=p-next),2020/4/25,46,【例9.15】刪除學生電話簿鏈表中指定學生的信息。,9.1結構體,9.1.5結構體的應用鏈表,(b)刪除中間結點或尾結點(q-next=p-next),2020/4/25,47,【例9.15】刪除學生電話簿鏈表中指定學生的信息。,9.1結構體,9.1.5結構體的應用鏈表,(c)未找到指定的結點(strcmp(x,p-name)!=0),2020/4/25,48,if(strcmp(x,p-name)=0)if(p=head)head=p-next;/*刪除頭結點*/elseq-next=p-next;/*刪除中間或尾結點*/free(p);/*釋放被刪除的結點*/elseprintf(Notfound.);/*未找到指定的結點*/h=head;returnh;,#include#include#defineNEW(structnode*)malloc(sizeof(structnode)structnodecharname20,tel9;structnode*next;,9.1結構體,9.1.5結構體的應用鏈表,2020/4/25,49,將一個新結點插入到鏈表中,首先要尋找插入的位置。如果要求在第i個結點前插入,可設置三個工作指針p0、p和q,p0是指向待插入結點的指針。利用p和q指針查找第i個結點,找到后再將新結點鏈接到鏈表上。,9.1結構體,9.1.5結構體的應用鏈表,6.在單向鏈表中插入結點,q,q,新的第i個結點,2020/4/25,50,【例9.16】在學生電話簿鏈表中插入一個學生的信息。要求將新的信息插入在指定學生信息之前,如果未找到指定學生,則追加在鏈表尾部。,9.1結構體,9.1.5結構體的應用鏈表,當姓名不同并且不是尾結點循環(huán),空表時插入結點,在表尾追加結點,在表頭插入結點,在表中間插入結點,2020/4/25,51,【例9.16】在學生電話簿鏈表中插入一個學生的信息。要求將新的信息插入在指定學生信息之前,如果未找到指定學生,則追加在鏈表尾部。,9.1結構體,9.1.5結構體的應用鏈表,(a)在表頭插入結點(head=p0;p0-next=p),2020/4/25,52,【例9.16】在學生電話簿鏈表中插入一個學生的信息。要求將新的信息插入在指定學生信息之前,如果未找到指定學生,則追加在鏈表尾部。,9.1結構體,9.1.5結構體的應用鏈表,(b)在表中間插入結點(q-next=p0;p0-next=p),2020/4/25,53,【例9.16】在學生電話簿鏈表中插入一個學生的信息。要求將新的信息插入在指定學生信息之前,如果未找到指定學生,則追加在鏈表尾部。,9.1結構體,9.1.5結構體的應用鏈表,(c)在表尾追加結點(p-next=p0;p0-next=NULL),2020/4/25,54,if(strcmp(x,p-name)=0)if(p=head)head=p0;/*在表頭插入結點*/elseq-next=p0;/*在表中間插入結點*/p0-next=p;elsep-next=p0;/*在表尾插入結點*/p0-next=NULL;h=head;returnh;,9.1結構體,9.1.5結構體的應用鏈表,#include#include#defineNEW(structnode*)malloc(sizeof(structnode)structnodecharname20,tel9;structnode*next;,2020/4/25,55,9.1結構體,9.1.5結構體的應用鏈表,【例9.17】學生電話簿鏈表管理程序。,編制此程序可利用例9.13至例9.16的4個函數完成鏈表的建立、輸出、刪除和插入等功能,這里只需編制一個main函數完成對這4個函數的調用。#include#defineNEW(structnode*)malloc(sizeof(structnode)structnodecharname20,tel9;structnode*next;,2020/4/25,56,9.1結構體,9.1.5結構體的應用鏈表,main()structnode*create(),*delnode(structnode*,char*);structnode*insert(structnode*,structnode*,char*);voidprlist(structnode*);structnode*head=NULL,*stu;chars80,name20;intc;,2020/4/25,57,9.1結構體,9.1.5結構體的應用鏈表,dodoprintf(n*MENU*n);printf(1.Createalistn);printf(2.Printalistn);printf(3.Deleteanoden);printf(4.Insertanoden);printf(0.Quitn);printf(Enteryourchoice(0-4):);gets(s);c=atoi(s);while(c4);,可以先選擇1建立一個鏈表,然后根據需要選擇功能2、功能3、功能4、直到選擇0退出程序的運行,2020/4/25,58,9.1結構體,9.1.5結構體的應用鏈表,switch(c)case1:head=create();break;case2:prlist(head);break;case3:printf(nInputanamedeleted:n);gets(name);head=delnode(head,name);break;case4:stu=NEW;printf(nInputanewnoden);printf(name:);gets(stu-name);printf(tel:);gets(stu-tel);stu-next=NULL;printf(nInsertpositionn);printf(name:);gets(name);head=insert(head,stu,name);while(c);,2020/4/25,59,結構體類型解決了如何描述一個邏輯上相關,但數據類型不同的一組分量的集合。在需要節(jié)省內存儲空間時,c語言還提供了一種由若干個不同類型的數據項組成,但共享同一存儲空間的構造類型。,9.2共用體,9.2.1共用體與共用體類型的定義,共用體一種構造類型數據共用體由若干不同類型的數據項組成,構成共用體的各個數據項稱為共用體成員。,由于共享的特性,只有最新存儲的數據是有效的。,2020/4/25,60,union共用體名數據類型1成員名1;數據類型2成員名2;數據類型n成員名n;,9.2共用體,9.2.1共用體與共用體類型的定義,共用體類型定義的一般形式:,union為關鍵字;共用體名是用戶定義的類型標識。中是組成該共用體的成員。成員的數據類型可以是C語言所允許的任何數據類型。,2020/4/25,61,例如:unionutypeinti;charch;longl;charc4;,9.2共用體,9.2.1共用體與共用體類型的定義,定義了一個unionutype共用體類型,共用體類型定義不分配內存空間,只是說明此類型數據的組成情況。,2020/4/25,62,9.2共用體,9.2.2共用體變量的定義與初始化,1.共用體變量的定義,利用已定義的共用體類型名定義變量union共用體名變量名表;例如:unionutypeu1,u2;,按照共用體類型的組成,系統(tǒng)為定義的共用體變量分配內存單元。共用體變量所占內存大小等于共用體中占用內存的長度最長的成員。,2020/4/25,63,9.2共用體,9.2.2共用體變量的定義與初始化,1.共用體變量的定義,在定義共用體類型的同時定義變量,例如:unionutypeinti;charch;longl;charc4;a,b,c;,union共用體名成員定義表;變量名表;,2020/4/25,64,9.2共用體,9.2.2共用體變量的定義與初始化,1.共用體變量的定義,直接定義共用體類型變量,例如:unioninti;charch;longl;charc4;a,b,c;,union成員定義表;變量名表;,2020/4/25,65,9.2共用體,9.2.2共用體變量的定義與初始化,2.共用體變量的運算,用sizeof運算符計算共用體變量所占內存空間,unionutypeinti;charch;longl;charc4;a,b,c;,sizeof(a)的結果為4sizeof(unionutype)的結果為4,2020/4/25,66,9.2共用體,9.2.2共用體變量的定義與初始化,2.共用體變量的運算,同類型共用體變量之間的賦值運算,共用體變量之間進行賦值時,系統(tǒng)僅賦當前有效成員的值(即最新存儲的數據)。,unionutypeinti;charch;longl;charc4;a,*p=,對共用體變量進行取址運算,2020/4/25,67,9.2共用體,9.2.2共用體變量的定義與初始化,3.共用體變量成員的引用,共用體變量成員的引用有三種形式。,例如:unionucharu1;intu2;x,*p=,用共用體變量名的引用形式:x.u1x.u2,用共用體指針變量的引用形式:(*p).u1(*p).u2p-u1p-u2,2020/4/25,68,9.2共用體,9.2.2共用體變量的定義與初始化,4.共用體變量賦初值,【例9.18】共用體變量賦初值。unionucharu1;intu2;main()unionua=0 x9741;printf(1.%c%xn,a.u1,a.u2);a.u1=a;printf(2.%c%xn,a.u1,a.u2);,共用體類型變量在定義時只能對第一個成員進行賦初值。由于第一個成員是字符型,用一個字節(jié),所以對于初值0 x9741僅能接受0 x41,初值的高字節(jié)被截去。,1.A41,2.a61,2020/4/25,69,9.2共用體,9.2.2共用體變量的定義與初始化,main()unionlongn;intk;charc;un;un.n=0 x12345678;printf(%lxn,un.n);printf(%xn,un.k);printf(%xn,un.c);un.c=A;printf(%ldn,un.n);printf(%dn,un.k);printf(%cn,un.c);,12345678,5678,78,305419841,22081,A,2020/4/25,70,enum是關鍵字;枚舉名和枚舉常量是標識符;枚舉常量之間用逗號分隔。,例如:enumweekdaySun,Mon,Tue,Wed,Thu,Fri,Sat;enumcolor1blue,green,red;enumflagfalse,true;,9.3枚舉類型與類型命名,9.3.1枚舉類型,1.枚舉類型的定義,枚舉類型定義的一般形式:enum枚舉名枚舉常量取值表;,枚舉是一個具有有限個整型符號常量的集合,這些整型符號常量稱為枚舉常量。每個枚舉類型都必須進行類型的定義,定義時必須將其所有的枚舉常量一一列舉,以便限定此枚舉類型變量的取值范圍。,2020/4/25,71,在枚舉類型中,每個枚舉常量都代表一個整型值。在定義枚舉類型的同時可隱式或顯式地定義枚舉常量所代表的值。,例如:enumweekdaySun,Mon,Tue,Wed,Thu,Fri,Sat;,9.3枚舉類型與類型命名,9.3.1枚舉類型,2.枚舉常量的整型值,隱式定義:按照類型定義時枚舉常量列舉的順序分別代表0、1、2、等整型值。,0,1,2,3,4,5,6,2020/4/25,72,例如:enumopplus=43,minus=45,multiply=42,divide=47;enumworkdayMon=1,Tue,Wed,Thu,Fri;,9.3枚舉類型與類型命名,9.3.1枚舉類型,2.枚舉常量的整型值,顯式定義:在定義類型的同時指定枚舉常量的值,其中如有未指定值的枚舉常量,則根據前面的枚舉常量的值依次遞增1。,2,3,4,5,2020/4/25,73,例如:enumflagfg;enumcolor1c1;enumcolor2blank,brown,yellow,whitec2;enumlightblue,lightgreen,lightredc3;,9.3枚舉類型與類型命名,9.3.1枚舉類型,3.枚舉變量的定義,枚舉類型變量定義的三種形式:enum枚舉名枚舉變量名表;enum枚舉名枚舉常量取值表枚舉變量表;enum枚舉常量取值表枚舉變量表;,2020/4/25,74,賦值運算fg=true;c1=red;c2=yellow;c3=lightblue;c3=white;,9.3枚舉類型與類型命名,9.3.1枚舉類型,4.枚舉數據的運算,用sizeof運算符計算枚舉變量所占內存空間,枚舉變量中存放的是整型值,每個枚舉變量占用2個字節(jié),是enumcolor2類型的枚舉值,2020/4/25,75,取址運算enumcolor2blank,brown,yellow,whitec2;enumflagfg;printf(%d,fg);,2020/4/25,77,switch(fg)casefalse:printf(false);break;casetrue:printf(true);,9.3枚舉類型與類型命名,9.3.1枚舉類型,5.枚舉數據的輸入輸出,枚舉變量的輸出,方法二:利用多分支選擇語句輸出枚舉常量對應的字符串。,2020/4/25,78,enumflagfalse,truefg;char*name=false,true;fg=true;printf(%s,namefg);,9.3枚舉類型與類型命名,9.3.1枚舉類型,5.枚舉數據的輸入輸出,枚舉變量的輸出,方法三:依據枚舉值,運用指針方法輸出對應的字符串。,2020/4/25,79,fg=true;printf(%s,fg);,9.3枚舉類型與類型命名,9.3.1枚舉類型,5.枚舉數據的輸入輸出,枚舉變量的輸出,枚舉常量是標識符,不是字符串,以輸出字符串方式輸出枚舉常量是錯誤的。,2020/4/25,80,9.3枚舉類型與類型命名,9.3.1枚舉類型,【例9.20】編制一個程序。當輸入今天的星期序號后,輸出明天是星期幾。enumweekdayMon=1,Tue,Wed,Thu,Fri,Sat,Sun;char*name8=error,Mon,Tue,Wed,Thu,Fri,Sat,Sun;,2020/4/25,81,9.3枚舉類型與類型命名,9.3.1枚舉類型,main()enumweekdayd;printf(Inputtodaysnumeral(1-7):);scanf(%d,2020/4/25,82,9.3枚舉類型與類型命名,9.3.2類型的重新命名,1.為類型名定義別名,為類型名定義別名的一般形式:typedef類型名新類型名或typedef類型定義新類型名,用typedef為已存在的類型名再命名一個新的類型名(即別名)。,typedef是關鍵字;類型名可以是基本類型、構造類型、指針類型或自定義類型名;新類型名是自定義的類型名。,2020/4/25,83,9.3枚舉類型與類型命名,9.3.2類型的重新命名,typedefintCOUNTER;/*定義COUNTER為整型類型名*/typedefstructdateintyear;intmonth;intday;DATE;/*定義DATE為structdate結構體類型名*/,新類型名與舊類型名作用相同,并且可同時使用。,inti;與COUNTERi;等價。structdatebirthday;與DATEbirthday;等價。,2020/4/25,84,9.3枚舉類型與類型命名,9.3.2類型的重新命名,2.為類型命名的方法,為基本類型命名例如:typedeffloatREAL;REALx,y;/*相當于floatx,y;*/,以typedef開頭,加上變量定義的形式,并用新類型名替代變量名。,為數組類型命名例如:typedefcharCHARR80;CHARRc,d4;/*相當于charc80,d480;*/,2020/4/25,85,9.3枚舉類型與類型命名,9.3.2類型的重新命名,2.為類型命名的方法,為指針類型命名例如:typedefint*IPOINT;IPOINTip;/*相當于int*ip;*/IPOINT*pp;/*相當于int*pp;*/,typedefint(*FUNpoint)();FUNpointfunp;/*相當于int(*funp)();*/,2020/4/25,86,9.3枚舉類型與類型命名,9.3.2類型的重新命名,2.為類型命名的方法,為結構體、共用體類型命名例如:structnodecharc;structnode*next;typedefstructnodeCHNODE;CHNODE*p;/*相當于structnode*p;*/,structCHNODE*p;,- 配套講稿:
如PPT文件的首頁顯示word圖標,表示該PPT已包含配套word講稿。雙擊word圖標可打開word文檔。
- 特殊限制:
部分文檔作品中含有的國旗、國徽等圖片,僅作為作品整體效果示例展示,禁止商用。設計者僅對作品中獨創(chuàng)性部分享有著作權。
- 關 鍵 詞:
- 語言程序設計 教程 結構 共用
裝配圖網所有資源均是用戶自行上傳分享,僅供網友學習交流,未經上傳用戶書面授權,請勿作他用。
鏈接地址:http://italysoccerbets.com/p-11494863.html