《其他數(shù)據(jù)類型》PPT課件.ppt
《《其他數(shù)據(jù)類型》PPT課件.ppt》由會員分享,可在線閱讀,更多相關(guān)《《其他數(shù)據(jù)類型》PPT課件.ppt(54頁珍藏版)》請在裝配圖網(wǎng)上搜索。
第6章其他數(shù)據(jù)類型,,學習目標,結(jié)構(gòu)體的定義與使用結(jié)構(gòu)體與指針共用體的定義與使用枚舉類型的定義與使用typedef定義數(shù)據(jù)類型位運算規(guī)則,6.1結(jié)構(gòu)體,引入:數(shù)據(jù)的基本類型:整、實、字符。數(shù)組是構(gòu)造類型:每個元素為同一類型,有些問題僅用基本類型和數(shù)組來描述是無法實現(xiàn)的?,舉例:如學生情況表,這些數(shù)據(jù)類型雖不相同,但它們卻是有機的整體,若將它們分別定義,則難以反映它們之間的內(nèi)在聯(lián)系。如何解決呢?用結(jié)構(gòu)體。,結(jié)構(gòu)體是一種構(gòu)造數(shù)據(jù)類型用途:把不同類型的數(shù)據(jù)組合成一個整體,又稱自定義數(shù)據(jù)類型結(jié)構(gòu)體類型定義,struct[結(jié)構(gòu)體類型名]{類型標識符成員名;類型標識符成員名;……};,成員類型可以是基本型或構(gòu)造型,struct是關(guān)鍵字,不能省略,合法標識符,可根據(jù)情況省略,6.1.1結(jié)構(gòu)體類型的定義,Structstudent{intnum;charname[20];charsex;intage;floatscore;charaddr[30];};,結(jié)構(gòu)體類型定義,描述結(jié)構(gòu)的組織形式,不分配內(nèi)存,以上語句的作用是:定義了一個名為student的結(jié)構(gòu)體類型,它具有以下結(jié)構(gòu):,6.1.2結(jié)構(gòu)體變量,(1)結(jié)構(gòu)體類型變量的聲明間接法:先聲明結(jié)構(gòu)體類型再定義變量名,struct結(jié)構(gòu)體名{類型標識符成員名;類型標識符成員名;……………};struct結(jié)構(gòu)體名變量名表列;,直接法:在聲明結(jié)構(gòu)體類型的同時定義變量,struct結(jié)構(gòu)體名{類型標識符成員名;類型標識符成員名;......}變量名表列;,structstudent{intnum;charname[20];charsex;intage;floatscore;charaddr[30];}stu1,stu2;,struct{intnum;charname[20];charsex;intage;floatscore;charaddr[30];}stu1,stu2;,省去結(jié)構(gòu)體類型名,用無名結(jié)構(gòu)體直接定義變量只能一次。,說明:1.結(jié)構(gòu)體類型與結(jié)構(gòu)體變量概念不同2.結(jié)構(gòu)體可嵌套,sturctdate{intmonth;intday;intyear;};,structstudent{intnum;charname[20];charsex;structdatebirthday;floatscore;charaddr[30];}student1,student2;,,說明:3.結(jié)構(gòu)體成員名與程序中變量名可相同,不會混淆(2)結(jié)構(gòu)體變量的引用:結(jié)構(gòu)體變量.成員如:student1.num=1;strcpy(student1.name,“ZhangHua");student1.sex=M;student1.birthday.year=1980,如果某成員本身又是一個結(jié)構(gòu)體類型,則要用若干個成員運算符,一級一級找到最低一級的成員。成員運算符“.”的結(jié)合性為從左到右。如:student1.birthday.year結(jié)構(gòu)體變量的成員可以像普通變量一樣進行各種運算。例如:student1.birthday.day++;sum=student1.score+5;,可以引用結(jié)構(gòu)體變量成員的地址,也可以引用結(jié)構(gòu)體變量的地址。如:,struct結(jié)構(gòu)體類型名{類型標識符成員名;類型標識符成員名;......};struct結(jié)構(gòu)體名結(jié)構(gòu)體變量={初始數(shù)據(jù)};,structss{intnum;charname[20];charsex;intage;charaddr[30];};structssstu1={112,“WangLin”,‘M’,19,“200BeijingRoad”};,(3)結(jié)構(gòu)體變量的初始化,形式二:,struct[結(jié)構(gòu)體類型名]{類型標識符成員名;類型標識符成員名;......}結(jié)構(gòu)體變量={初始數(shù)據(jù)};,structss{intnum;charname[20];charsex;intage;charaddr[30];}stu1={112,“WangLin”,‘M’,19,“200BeijingRoad”};,結(jié)構(gòu)體類型名ss可以省略,(4)求結(jié)構(gòu)體變量占用內(nèi)存的大小求變量或類型說明符占用內(nèi)存大小可以使用sizeof運算符。sizeof是單目運算符,其功能是求出變量或類型說明符所占的內(nèi)存空間的字節(jié)數(shù)。使用的一般形式為:sizeof(變量或類型說明符);,charstr[20];structdate{intyear,month,day;}today;structaddress{charname[30],street[40],city[20];unsignedlongintzip;}wang;printf("char:%d\t",sizeof(char));printf("str:%d\t",sizeof(str));printf("date:%d\t",sizeof(structdate));printf("wang:%d\n",sizeof(wang));,6.1.3結(jié)構(gòu)體數(shù)組,(1)定義結(jié)構(gòu)體數(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];,(2)結(jié)構(gòu)體數(shù)組的初始化,struct{intnum;charname[20];charsex;intage;}stu[..]={{...},{...},{...}};,(3)結(jié)構(gòu)體數(shù)組元素、成員引用引用方式:結(jié)構(gòu)體數(shù)組名[下標].成員名,structstudent{intnum;charname[20];charsex;intage;}str[3];,stu[1].age++;,strcpy(stu[0].name,”ZhaoDa”);,,#include#includestructperson{charname[20];intcount;}lead[3]={"Li",0,"Zhang",0,"Wang",0};voidmain(){inti,j;charleader_name[20];for(i=1;i<=10;i++)//10張選票{scanf("%s",leader_name);for(j=0;j<3;j++)//每張選票與3個候選人姓名對比if(strcmp(leader_name,lead[j].name)==0)lead[j].count++;}for(i=0;i成員名,注意:”.“用于結(jié)構(gòu)體變量訪問成員而“->”用于結(jié)構(gòu)體指針變量訪問成員。使用中要注意兩者的優(yōu)先級與結(jié)合性問題。,p->n得到p指向的結(jié)構(gòu)體變量中的成員n的值。p->n++得到p指向的結(jié)構(gòu)體變量中的成員n的值,用完該值后使它加1。++p->n得到p指向的結(jié)構(gòu)體變量中的成員n的值使之加1(先加)。,構(gòu)造數(shù)據(jù)類型,也叫聯(lián)合體幾個不同類型的變量共占一段內(nèi)存(相互覆蓋)定義形式,6.3共用體,union共用體類型名{類型標識符成員名;類型標識符成員名;......};,除去關(guān)鍵字,其形式和結(jié)構(gòu)體定義一致,uniondata{charch;inti;floatf;};,uniondata{inti;charch;floatf;}a,b;,uniondata{inti;charch;floatf;};uniondataa,b,c,*p,d[3];,共用體變量的定義:,由于是共用一段內(nèi)存,因此:共用體變量任何時刻只有一個成員存在共用體變量定義分配內(nèi)存長度是最長成員所占字節(jié)數(shù),共用體變量引用,uniondata{inti;charch;floatf;};uniondataa,b,c,*p,d[3];,a.i,a.ch,a.fp->i,p->ch,p->f(*p).i,(*p).ch,(*p).fp->i,p->ch,p->fd[0].i,d[0].ch,d[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);(?編譯通過,運行結(jié)果不對),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;(?),,union//定義共用體并說明共用體變量mix{longi;intk;charii;chars[4];}mix;mix.i=0 x12345678;printf("mix.i=%lx\n",mix.i);printf("mix.k=%x\n",mix.k);printf("mix.ii=%x\n",mix.ii);printf("mix.s[0]=%x\tmix.s[1]=%x\n",mix.s[0],mix.s[1]);printf("mix.s[2]=%x\tmix.s[3]=%x\n",mix.s[2],mix.s[3]);,[例6.8]分析以下程序的運行結(jié)果。,,變量的各成員同時存在,任一時刻只有一個成員存在,結(jié)構(gòu)體與共用體區(qū)別:存儲方式不同聯(lián)系:兩者可相互嵌套,6.4枚舉類型,概念:“枚舉”是指將變量的值一一列舉出來,變量的取值只限于列舉出來的值的范圍。定義:enum枚舉類型名{取值表};變量定義:enumcolour{Red,Blue,Yellow,White};enumcolourc1,c2;c1,c2為枚舉型變量,其值可以取括號中的任意一個。c1=Yellow;(√)c2=White;(√)c1=Black;()c2=2;(),說明(1)對枚舉元素按常量處理,故稱枚舉常量。枚舉常量是有值的,編譯時按定義時的順序依次置為0,1,2…,在上面的定義中,枚舉元素的值分別為:Red=0,Blue=1,Yellow=2,White=3。(2)不能對枚舉常量賦值,要改變枚舉常量的值只能在定義時由程序指定。例如:enumcolour{Red=10,Blue=0,Yellow,White};則這時Red=10,Blue=0,Yellow=1,White=2。當定義枚舉變量enumcolourc1,c2;后,若給枚舉變量賦值:c1=Red;則枚舉變量c1中的值為10c2=White;則枚舉變量c2中的值為2。,6.5用typedef定義類型,功能:用自定義名字為已有數(shù)據(jù)類型命名形式:typedeftypename;,類型定義語句關(guān)鍵字,已有數(shù)據(jù)類型名,用戶定義的類型名,若有:typedefintINTEGER;typedeffloatREAL;則:INTEGERi,j;等價于inti,j;REALpai;等價于floatpai;,typedef常用于結(jié)構(gòu)體類型的定義:typedefstruct{intmonth;intday;intyear;}DATE;聲明新類型名DATE,它代表上面指定的一個結(jié)構(gòu)體類型。DATEbirthday,*p;,類型定義后,與已有類型一樣使用,typedef也可用于數(shù)組和指針類型的定義:typedefintARR[20];ARRa,b,d;等價于:inta[20],b[20],d[20];typedefint*point;pointp1,p2;等價于:int*p1,*p2;,說明:1.typedef沒有創(chuàng)造新數(shù)據(jù)類型2.typedef是定義類型,不能定義變量3.typedef與define不同4.typedef可以嵌套,typedefstructclub{charname[20];intsize;intyear;}GROUP;typedefGROUP*PG;PGpclub;,GROUP為結(jié)構(gòu)體類型,PG為指向GROUP的指針類型,等價于:structclub{charname[20];intsize;intyear;}*pclub;,6.6位運算及位字段,位運算符和位運算位運算舉例,6.6.1位運算符和位運算,前面介紹的各種運算都是以字節(jié)作為最基本位進行的。但在很多系統(tǒng)程序中常要求在位(bit)一級進行運算或處理。C語言提供了位運算的功能,這使得C語言也能像匯編語言一樣用來編寫系統(tǒng)程序。按位與a=a<>):運算規(guī)則:a=a>>n將a中所有位向右移動n位。作用:相當于除法運算。每右移一位相當于除以2。注意數(shù)的符號問題(即正負的問題)對于無符號數(shù)(正數(shù))右移時高位補以0。對于有符號數(shù),高位為0(正數(shù))右移時高位補以0。對于有符號數(shù),高位為1(負數(shù))時:①右移時高位補以0,稱之為“邏輯位移”。②右移時高位補以1,稱之為“算術(shù)位移”。TC采用“算術(shù)位移”,高位補以1。,7、不同長度的數(shù)據(jù)進行位運算時的規(guī)則規(guī)則:如果兩個不同長度的數(shù)據(jù)(例如char型和int型)進行位運算,系統(tǒng)將會對二者進行處理:先將兩個運算數(shù)按右端對齊,再將較短的一個運算數(shù)往高位擴充,即無符號數(shù)和正整數(shù)左側(cè)用0補齊;負數(shù)左側(cè)用1補齊,最后按位進行位運算。,8、位運算的復合賦值運算符:ascanf("%o",,,將要取的4~9位移到最右端,即將a右移4位,設(shè)置一個低6位全為1,其余全為0的數(shù)0:0000…0000000~0:1111…1111111~0<<6:1111…1000000~(~0<成員名。數(shù)組元素的類型為結(jié)構(gòu)的數(shù)組稱為結(jié)構(gòu)數(shù)組。,結(jié)構(gòu)體定義允許嵌套,結(jié)構(gòu)體中也可用共用體作為成員,形成結(jié)構(gòu)體和共用體的嵌套。共用體與結(jié)構(gòu)體類似,區(qū)別在于共用體各個成員共享同一片內(nèi)存區(qū)域。位運算是C語言的一種特殊運算功能,它是以二進制位為單位進行運算的。位運算符只有邏輯運算和移位運算兩類。位運算符可以與賦值符一起組成復合賦值符。如shorta;};unionuwordu={2.5};/*錯誤*/,使用位運算符時應(yīng)注意:①如同表達式a+2不能改變a的值一樣,a>兩邊必須都是整型數(shù),否則非法。如a<<2.0是錯誤的。③不同長度的變量進行位運算時,系統(tǒng)會自動右對齊,而左端的不齊部分,會按最高位進行擴展。,- 1.請仔細閱讀文檔,確保文檔完整性,對于不預覽、不比對內(nèi)容而直接下載帶來的問題本站不予受理。
- 2.下載的文檔,不會出現(xiàn)我們的網(wǎng)址水印。
- 3、該文檔所得收入(下載+內(nèi)容+預覽)歸上傳者、原創(chuàng)作者;如果您是本文檔原作者,請點此認領(lǐng)!既往收益都歸您。
下載文檔到電腦,查找使用更方便
14.9 積分
下載 |
- 配套講稿:
如PPT文件的首頁顯示word圖標,表示該PPT已包含配套word講稿。雙擊word圖標可打開word文檔。
- 特殊限制:
部分文檔作品中含有的國旗、國徽等圖片,僅作為作品整體效果示例展示,禁止商用。設(shè)計者僅對作品中獨創(chuàng)性部分享有著作權(quán)。
- 關(guān) 鍵 詞:
- 其他數(shù)據(jù)類型 其他 數(shù)據(jù)類型 PPT 課件
鏈接地址:http://www.3dchina-expo.com/p-11501989.html