![自訂資料型態(tài)-–-結(jié)構(gòu)優(yōu)秀文檔_第1頁](http://file4.renrendoc.com/view/3a6a54ab70e20b4796f17e179a96a040/3a6a54ab70e20b4796f17e179a96a0401.gif)
![自訂資料型態(tài)-–-結(jié)構(gòu)優(yōu)秀文檔_第2頁](http://file4.renrendoc.com/view/3a6a54ab70e20b4796f17e179a96a040/3a6a54ab70e20b4796f17e179a96a0402.gif)
![自訂資料型態(tài)-–-結(jié)構(gòu)優(yōu)秀文檔_第3頁](http://file4.renrendoc.com/view/3a6a54ab70e20b4796f17e179a96a040/3a6a54ab70e20b4796f17e179a96a0403.gif)
![自訂資料型態(tài)-–-結(jié)構(gòu)優(yōu)秀文檔_第4頁](http://file4.renrendoc.com/view/3a6a54ab70e20b4796f17e179a96a040/3a6a54ab70e20b4796f17e179a96a0404.gif)
![自訂資料型態(tài)-–-結(jié)構(gòu)優(yōu)秀文檔_第5頁](http://file4.renrendoc.com/view/3a6a54ab70e20b4796f17e179a96a040/3a6a54ab70e20b4796f17e179a96a0405.gif)
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
第9章自訂資料型態(tài)–結(jié)構(gòu)9-1結(jié)構(gòu)資料型態(tài)9-2結(jié)構(gòu)陣列9-3指標(biāo)與結(jié)構(gòu)9-4動(dòng)態(tài)記憶體配置9-5聯(lián)合資料型態(tài)9-6列舉資料型態(tài)9-7建立新型態(tài)typedef9-8位元欄位9-9日期/時(shí)間函數(shù)的tm結(jié)構(gòu)9-1結(jié)構(gòu)資料型態(tài)9-1-1結(jié)構(gòu)的基礎(chǔ)9-1-2宣告結(jié)構(gòu)型態(tài)9-1-3巢狀結(jié)構(gòu)9-1-4結(jié)構(gòu)與函數(shù)9-1-1結(jié)構(gòu)的基礎(chǔ)「結(jié)構(gòu)」(Structures)是C語言的延伸資料型態(tài),它和聯(lián)合、列舉都屬於自定資料型態(tài)(User-DefinedTypes),可以讓程式設(shè)計(jì)者自行在程式碼定義新的資料型態(tài)。結(jié)構(gòu)是由一或多個(gè)不同資料型態(tài)(當(dāng)然可以是相同資料型態(tài))所組成的集合。例如:圖形的點(diǎn)是由X軸和Y軸的座標(biāo)(x,y)所組成,如下所示:structpoint{intx;inty;};9-1-2宣告結(jié)構(gòu)型態(tài)-語法在C程式宣告結(jié)構(gòu)是使用struct關(guān)鍵字定義新型態(tài),其語法如下所示:struct結(jié)構(gòu)名稱{資料型態(tài)變數(shù)1;資料型態(tài)變數(shù)2;……};語法定義名為【結(jié)構(gòu)名稱】的新資料型態(tài),在結(jié)構(gòu)中宣告的變數(shù)稱為該結(jié)構(gòu)的「成員」(Members)。9-1-2宣告結(jié)構(gòu)型態(tài)-範(fàn)例例如:宣告學(xué)生資料的結(jié)構(gòu)student,如下所示:structstudent{intid;charname[20];intmath;intenglish;intcomputer;};結(jié)構(gòu)是由學(xué)號(hào)id、學(xué)生姓名name、數(shù)學(xué)成績(jī)math、英文成績(jī)english和電腦成績(jī)computer的成員變數(shù)所組成。9-1-2宣告結(jié)構(gòu)型態(tài)-結(jié)構(gòu)變數(shù)當(dāng)宣告student結(jié)構(gòu)後,它是一個(gè)自訂型態(tài),在程式碼可以使用新型態(tài)宣告變數(shù),其語法如下所示:struct結(jié)構(gòu)名稱變數(shù)名稱;宣告使用struct關(guān)鍵字開頭加上結(jié)構(gòu)名稱來宣告結(jié)構(gòu)變數(shù),以本節(jié)的範(fàn)例為例,結(jié)構(gòu)變數(shù)的宣告,如下所示:structstudentstd1;structstudentstd2={2,"江小魚",45,78,66};9-1-2宣告結(jié)構(gòu)型態(tài)-結(jié)構(gòu)與成員變數(shù)的運(yùn)算在建立好結(jié)構(gòu)變數(shù)後,就可以存取結(jié)構(gòu)各成員變數(shù)的值,如下所示:std1.id=1;strcpy(,"陳會(huì)安");std1.math=78;std1.english=65;puter=90;上述程式碼使用「.」運(yùn)算子存取結(jié)構(gòu)的成員變數(shù)。ANSI-C語言支援結(jié)構(gòu)變數(shù)的指定敘述,如下所示:structstudentstd3;std3=std2;9-1-3巢狀結(jié)構(gòu)-說明「巢狀結(jié)構(gòu)」(NestedStructures)是在宣告的結(jié)構(gòu)中擁有其它結(jié)構(gòu),例如:student結(jié)構(gòu),成績(jī)資料可以獨(dú)立成測(cè)驗(yàn)test結(jié)構(gòu),如下所示:structstudent{intid;charname[20];structtestscore;};structtest{intmath;intenglish;intcomputer;};9-1-3巢狀結(jié)構(gòu)-初值與存取在宣告student結(jié)構(gòu)變數(shù)時(shí),指定結(jié)構(gòu)的初值,如下所示:structstudentstd2={2,"江小魚",{45,78,66}};在存取score結(jié)構(gòu)變數(shù)時(shí),需要先存取結(jié)構(gòu)變數(shù)score,然後才能存取成員變數(shù)math、english和computer,如下所示:std1.score.math=78;std1.score.english=65;puter=90;9-4-4釋放配置的記憶體free()函數(shù)-說明id=1;strcpy(std1.9-1-2宣告結(jié)構(gòu)型態(tài)-語法9-4-1配置記憶體malloc()函數(shù)-語法列舉使用enum關(guān)鍵字進(jìn)行宣告,其語法如下所示:intmath;9-6列舉資料型態(tài)-語法語法定義名為【結(jié)構(gòu)名稱】的新資料型態(tài),在結(jié)構(gòu)中宣告的變數(shù)稱為該結(jié)構(gòu)的「成員」(Members)。enumcolor{enum列舉名稱變數(shù)名稱;在C語言提供另一種語法,結(jié)構(gòu)指標(biāo)可以直接使用「->」運(yùn)算子存取結(jié)構(gòu)的成員變數(shù),如下所示:「位元欄位」(Bit-fields)可以存取變數(shù)的位元資料,資料不是以位元組為單位來存取,而是其中的每一個(gè)位元。computer=90;9-1-4結(jié)構(gòu)與函數(shù)結(jié)構(gòu)不只可以作為函數(shù)的參數(shù),當(dāng)然也可以用來作為函數(shù)的傳回值。structpoint{intx;inty;};接著建立函數(shù)指定點(diǎn)座標(biāo)和計(jì)算位移,其函數(shù)的原型宣告,如下所示:structpointsetXY(int,int);structpointoffset(structpoint,int);9-1-4結(jié)構(gòu)與函數(shù)intdoors;9-1-4結(jié)構(gòu)與函數(shù)程式碼相當(dāng)於是worker.tm結(jié)構(gòu)的成員變數(shù),如下所示:h>標(biāo)頭檔的標(biāo)準(zhǔn)函式庫提供兩個(gè)函數(shù):malloc()和free(),可以分別在執(zhí)行時(shí)配置和釋放所需的記憶體空間。Green,inttm_wday;/*星期:從星期日起(0-6)*/先宣告結(jié)構(gòu)變數(shù),然後才能建立指向結(jié)構(gòu)的指標(biāo),如下所示:9-4-1配置記憶體malloc()函數(shù)-語法9-1-4結(jié)構(gòu)與函數(shù)「位元欄位」(Bit-fields)可以存取變數(shù)的位元資料,資料不是以位元組為單位來存取,而是其中的每一個(gè)位元。C語言結(jié)構(gòu)的各成員變數(shù)是佔(zhàn)用前後相連的記憶空間,聯(lián)合的記憶空間是疊起來的,其大小是成員變數(shù)中最大的那一個(gè)資料型態(tài)。聯(lián)合變數(shù)的成員都佔(zhàn)用同一塊記憶體,當(dāng)指定其中一個(gè)成員變數(shù)值,例如:後,存取其它成員變數(shù),不見得可以取得有意義的資料。結(jié)構(gòu)不只可以作為函數(shù)的參數(shù),當(dāng)然也可以用來作為函數(shù)的傳回值。structstudent{9-2結(jié)構(gòu)陣列「結(jié)構(gòu)陣列」(ArraysofStructure)就是結(jié)構(gòu)資料型態(tài)的陣列,例如:宣告test結(jié)構(gòu),如下所示:structtest{intmath;intenglish;intcomputer;};test型態(tài)建立陣列,如下所示:#defineNUM3structteststudents[NUM];9-3指標(biāo)與結(jié)構(gòu)-說明指標(biāo)也可以指向結(jié)構(gòu),例如:宣告lable結(jié)構(gòu)儲(chǔ)存員工的姓名和年齡,如下所示:structlabel{charname[20];intage;};先宣告結(jié)構(gòu)變數(shù),然後才能建立指向結(jié)構(gòu)的指標(biāo),如下所示:structlabelworker;structlabel*ptr;9-3指標(biāo)與結(jié)構(gòu)-存取接著將結(jié)構(gòu)指標(biāo)指向結(jié)構(gòu),如下所示:ptr=&worker;結(jié)構(gòu)指標(biāo)ptr指向結(jié)構(gòu)變數(shù)worker的位址,換個(gè)角度,使用指標(biāo)存取結(jié)構(gòu)的成員變數(shù),如下:(*ptr).age=50;程式碼相當(dāng)於是worker.age=50;。在C語言提供另一種語法,結(jié)構(gòu)指標(biāo)可以直接使用「->」運(yùn)算子存取結(jié)構(gòu)的成員變數(shù),如下所示:ptr->age=50;9-4動(dòng)態(tài)記憶體配置9-4-1配置記憶體malloc()函數(shù)9-4-2配置陣列的記憶體9-4-3配置結(jié)構(gòu)的記憶體9-4-4釋放配置的記憶體free()函數(shù)9-4動(dòng)態(tài)記憶體配置動(dòng)態(tài)記憶體配置不同於以前說明的靜態(tài)記憶體配置,它是在執(zhí)行階段才向作業(yè)系統(tǒng)要求配置記憶空間,如此可以更加靈活運(yùn)用記憶體空間。在C語言的<stdlib.h>標(biāo)頭檔的標(biāo)準(zhǔn)函式庫提供兩個(gè)函數(shù):malloc()和free(),可以分別在執(zhí)行時(shí)配置和釋放所需的記憶體空間。9-4-1配置記憶體malloc()函數(shù)-語法如果需要配置size尺寸的記憶空間,函數(shù)傳回void通用型指標(biāo),需要加上型態(tài)迫換,將函數(shù)傳回的指標(biāo)轉(zhuǎn)換成所需資料型態(tài)的指標(biāo),如下:fp=(資料型態(tài)*)malloc(sizeof(資料型態(tài)));程式碼使用sizeof運(yùn)算子取得指定資料型態(tài)的大小。9-4-1配置記憶體malloc()函數(shù)-範(fàn)例配置一個(gè)浮點(diǎn)數(shù)變數(shù)的記憶空間,如下所示:fp=(float*)malloc(sizeof(float));malloc()函數(shù)傳回一個(gè)浮點(diǎn)的記憶體指標(biāo)且指定給指標(biāo)fp。如果記憶體空間不足,函數(shù)malloc()會(huì)傳回一個(gè)空指標(biāo)NULL,程式需確定記憶體配置成功,傳回有效指標(biāo),如下所示:if(fp!=NULL){…….}9-4-2配置陣列的記憶體陣列是相同型態(tài)的變數(shù)集合,只需配置一整塊連續(xù)的記憶空間就可以當(dāng)成陣列來使用。首先宣告一個(gè)陣列資料型態(tài)指標(biāo),如下所示:int*score;整數(shù)指標(biāo)可以用來指向整數(shù)陣列,接著呼叫malloc()函數(shù)配置所需的記憶體空間,如下所示:score=(int*)malloc(num*sizeof(int));9-4-3配置結(jié)構(gòu)的記憶體結(jié)構(gòu)或結(jié)構(gòu)陣列也可以使用動(dòng)態(tài)記憶體配置來配置記憶體空間,如下所示:structtest*students;students=(structtest*)malloc(num*sizeof(structtest));9-4-4釋放配置的記憶體free()函數(shù)-說明malloc()函數(shù)向作業(yè)系統(tǒng)要求記憶體空間,卻沒有在不用時(shí)釋回給作業(yè)系統(tǒng),如果程式將配置的記憶體空間歸還,這塊歸還後的記憶體空間就可以在下次呼叫函數(shù)malloc()時(shí)再重新配置,以便更有效率的使用記憶體空間。free()函數(shù)和malloc()函數(shù)的功能相反,可以釋放配置的記憶體空間。9-4-4釋放配置的記憶體free()函數(shù)-使用例如:指標(biāo)fp是指向malloc()傳回的浮點(diǎn)數(shù)記憶空間的指標(biāo),然後就可以呼叫free()函數(shù)釋放此塊記憶體,如下所示:free(fp);程式碼的指標(biāo)fp以此例是float浮點(diǎn)數(shù),它也可以是malloc()函數(shù)傳回的其它資料型態(tài)指標(biāo)或結(jié)構(gòu)指標(biāo)。9-5聯(lián)合資料型態(tài)9-5-1宣告聯(lián)合型態(tài)9-5-2結(jié)構(gòu)中的聯(lián)合型態(tài)9-5聯(lián)合資料型態(tài)在C語言宣告「聯(lián)合」(Unions)資料型態(tài)的方式類似結(jié)構(gòu),只不過結(jié)構(gòu)可以同時(shí)存取各成員變數(shù),聯(lián)合只能存取其中一個(gè)成員變數(shù),以便同一塊記憶體儲(chǔ)存不同型態(tài)的資料。9-5-1宣告聯(lián)合型態(tài)-語法C語言結(jié)構(gòu)的各成員變數(shù)是佔(zhàn)用前後相連的記憶空間,聯(lián)合的記憶空間是疊起來的,其大小是成員變數(shù)中最大的那一個(gè)資料型態(tài)。聯(lián)合使用union關(guān)鍵字進(jìn)行宣告,其語法如下所示:union聯(lián)合名稱{資料型態(tài)變數(shù)1;資料型態(tài)變數(shù)2;……};語法定義名為【聯(lián)合名稱】的新資料型態(tài)。9-5-1宣告聯(lián)合型態(tài)-範(fàn)例宣告儲(chǔ)存數(shù)值資料的聯(lián)合number,如下所示:unionnumber{charc;shortvalue;};聯(lián)合number是由字元c和短整數(shù)value組成,這個(gè)型態(tài)可以用來儲(chǔ)存字元或短整數(shù)資料。9-5-1宣告聯(lián)合型態(tài)-宣告聯(lián)合變數(shù)union如同結(jié)構(gòu)也屬於一種自訂的新型態(tài),在程式碼可以直接使用新型態(tài)宣告變數(shù),其語法如下所示:union聯(lián)合名稱變數(shù)名稱;宣告使用union關(guān)鍵字開頭加上聯(lián)合名稱來宣告聯(lián)合變數(shù),以本節(jié)的範(fàn)例為例,聯(lián)合變數(shù)的宣告,如下所示:unionnumberno;9-5-1宣告聯(lián)合型態(tài)-存取成員變數(shù)在建立好聯(lián)合變數(shù)後,就可以存取聯(lián)合的成員變數(shù),如下所示:no.value=num;程式碼使用「.」運(yùn)算子存取聯(lián)合的成員變數(shù)。請(qǐng)注意!聯(lián)合變數(shù)的成員都佔(zhàn)用同一塊記憶體,當(dāng)指定其中一個(gè)成員變數(shù)值,例如:後,存取其它成員變數(shù),不見得可以取得有意義的資料。9-5-2結(jié)構(gòu)中的聯(lián)合型態(tài)如同巢狀結(jié)構(gòu)一般,在結(jié)構(gòu)也可以使用聯(lián)合型態(tài)的成員變數(shù),例如:宣告結(jié)構(gòu)vehicle,如下所示:structvehicle{intweight;intutype;unionvehicletypevtype;};unionvehicletype{struct{intdoors;inttires;}car;struct{intwingspan;charengines;}plane;};9-6列舉資料型態(tài)-語法「列舉資料型態(tài)」(Enumerations)是使用符號(hào)名稱代表一組整數(shù)資料型態(tài)的值,如同常數(shù)使用名稱取代固定值,列舉是使用一組名稱來取代整數(shù)常數(shù)。列舉使用enum關(guān)鍵字進(jìn)行宣告,其語法如下所示:enum列舉名稱{成員名稱,成員名稱=常數(shù)值,成員名稱,……};9-6列舉資料型態(tài)-範(fàn)例宣告色彩名稱的列舉,如下所示:enumcolor{White=1,Red,Blue=5,Green,Black=Green};White使用指定敘述指定常數(shù)值1,Red沒有指定,預(yù)設(shè)是前一個(gè)常數(shù)值加1,即2,Blue指定成5,Green為5+1,即6,Black指定成Green,表示和Green擁有相同值6。9-6列舉資料型態(tài)-列舉變數(shù)enum如同結(jié)構(gòu)或聯(lián)合也屬於自訂的新型態(tài),在程式碼可以直接使用新型態(tài)宣告變數(shù),其語法如下所示:enum列舉名稱變數(shù)名稱;宣告使用enum關(guān)鍵字開頭加上列舉名稱來宣告列舉變數(shù),以本節(jié)的範(fàn)例為例,列舉變數(shù)的宣告,如下所示:enumcolora,b,c,d,e;9-7建立新型態(tài)typedef在宣告結(jié)構(gòu)、聯(lián)合或列舉型態(tài)後,為了方便宣告,可以使用一個(gè)別名來取代此新型態(tài),這個(gè)別名是新增的識(shí)別字,用來定義全新的資料型態(tài),其語法如下所示:typedef資料型態(tài)識(shí)別字;識(shí)別字代表資料型態(tài),所以可以直接使用此識(shí)別字宣告變數(shù),例如:本節(jié)程式範(fàn)例的test結(jié)構(gòu),就可以使用typedef指令定義新識(shí)別字的型態(tài)和宣告變數(shù),如下所示:typedefstructtestscore;scorejoe;9-8位元欄位-宣告「位元欄位」(Bit-fields)可以存取變數(shù)的位元資料,資料不是以位元組為單位來存取,而是其中的每一個(gè)位元。位元欄位的宣告就是使用結(jié)構(gòu)方式宣告,例如:宣告bitfields的位元欄位,如下所示:structbitfields{unsignedintx:1;unsignedinty:1;unsignedintz:2;};9-8位元欄位-變數(shù)宣告位元欄位的變數(shù)宣告和存取方式和結(jié)構(gòu)相同,也是使用「.」運(yùn)算子,如下所示:structbitfieldsbits;printf("x=%x\n",bits.x);printf("y=%x\n",bits.y);不過因?yàn)槲辉獧谖恍娴奈辉償?shù)並不能單獨(dú)進(jìn)行運(yùn)算,以此例因?yàn)橹挥?位元,並不能使用指定敘述指定其值。intcomputer;value=num;structpointoffset(str
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024民間借貸合同范本(28篇)
- 2025年農(nóng)村子女撫養(yǎng)費(fèi)用分擔(dān)協(xié)議
- 2025年供電企業(yè)與用戶用電合作協(xié)議
- 2025年共同策劃健身房合作合同書
- 企業(yè)勞動(dòng)合同協(xié)議2025年
- 2025年企業(yè)員工勞動(dòng)合同補(bǔ)充協(xié)議范本
- 2025年鋁合金預(yù)拉伸厚板和蒙皮鋁合金板項(xiàng)目立項(xiàng)申請(qǐng)報(bào)告模范
- 2025年高性能陶瓷復(fù)合材料項(xiàng)目立項(xiàng)申請(qǐng)報(bào)告模板
- 2025年企業(yè)變更代理協(xié)議
- 2025年漲緊輪項(xiàng)目提案報(bào)告模板
- 中心醫(yī)院消防施工組織設(shè)計(jì)
- 港口自動(dòng)化與智慧港口發(fā)展方向
- 人教版小學(xué)英語單詞表(完整版)
- 飛灰處置及資源化綜合利用項(xiàng)目可行性研究報(bào)告模板-備案拿地
- 2024年咨詢工程師考試大綱
- 免疫治療皮疹護(hù)理查房
- 2024年棉柔巾行業(yè)市場(chǎng)趨勢(shì)分析
- 黑龍江省哈爾濱市雙城區(qū)2024年八年級(jí)下冊(cè)物理期末經(jīng)典試題含解析
- 老年期譫妄課件
- 項(xiàng)目采購管理培訓(xùn)
- 河道保潔服務(wù)日常巡邏方案及措施
評(píng)論
0/150
提交評(píng)論