《C語言程序設(shè)計教程》課件第9章 結(jié)構(gòu)體_第1頁
《C語言程序設(shè)計教程》課件第9章 結(jié)構(gòu)體_第2頁
《C語言程序設(shè)計教程》課件第9章 結(jié)構(gòu)體_第3頁
《C語言程序設(shè)計教程》課件第9章 結(jié)構(gòu)體_第4頁
《C語言程序設(shè)計教程》課件第9章 結(jié)構(gòu)體_第5頁
已閱讀5頁,還剩50頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

第九章結(jié)構(gòu)體、共用體和枚舉類型2第九章

結(jié)構(gòu)體、共用體和枚舉類型教學(xué)目標(biāo):

掌握結(jié)構(gòu)體類型和結(jié)構(gòu)體類型變量的定義方法

掌握結(jié)構(gòu)體類型變量、數(shù)組和指針的引用方法熟悉共用體和枚舉類型的概念及應(yīng)用

了解鏈表的構(gòu)成原理和鏈表的實現(xiàn)方法了解自定義類型的用法3第九章

結(jié)構(gòu)體、共用體和枚舉類型教學(xué)重點與難點:熟悉結(jié)構(gòu)體類型和結(jié)構(gòu)體類型變量的定義方法熟悉結(jié)構(gòu)體類型變量、數(shù)組和指針的引用方法了解鏈表的構(gòu)成原理和鏈表的實現(xiàn)方法49.1結(jié)構(gòu)體概述

結(jié)構(gòu)體是可以將若干個不同數(shù)據(jù)類型的變量組合在一起的又一種數(shù)據(jù)類型。

結(jié)構(gòu)體和數(shù)組類似,都是多個數(shù)據(jù)的集合體。

兩者不同的是:數(shù)組是相同類型數(shù)據(jù)的集合體,而結(jié)構(gòu)體則可以是不同類型數(shù)據(jù)的集合體。

借助C語言提供的結(jié)構(gòu)體將表達(dá)同一對象的不同屬性封裝在一起,使之達(dá)到邏輯概念與程序變量一一對應(yīng)的目的,從而提高程序的清晰度,降低程序的復(fù)雜度,改善程序的可維護(hù)性。59.1.1定義結(jié)構(gòu)體類型9.1.1定義結(jié)構(gòu)體類型定義一個結(jié)構(gòu)體類型的一般格式為:struct結(jié)構(gòu)體名{

數(shù)據(jù)類型

成員1;

數(shù)據(jù)類型

成員2;

……

數(shù)據(jù)類型

成員n;};69.1.1定義結(jié)構(gòu)體類型說明:(1)struct是構(gòu)建結(jié)構(gòu)體類型的關(guān)鍵字,也就是說,在構(gòu)建結(jié)構(gòu)體類型時,必須用“struct”進(jìn)行聲明(2)結(jié)構(gòu)體名和各成員由用戶自行命名。關(guān)鍵字struct連同其后的結(jié)構(gòu)體名一起稱為結(jié)構(gòu)體類型名。(3)花括號內(nèi)是該結(jié)構(gòu)體所包含的子項,稱為結(jié)構(gòu)體的成員,每個成員是結(jié)構(gòu)體中的一個域。(4)在同一結(jié)構(gòu)體內(nèi),各成員的名稱不能相同;但不同結(jié)構(gòu)體中的成員名可以相同,并且結(jié)構(gòu)體的成員名可以與程序中的變量名相同。(5)花括號}后面的“;”不可缺少。(6)結(jié)構(gòu)體類型定義的位置,可以在函數(shù)內(nèi)部,也可以在函數(shù)外部。在函數(shù)內(nèi)部定義的結(jié)構(gòu)體類型,只能在函數(shù)內(nèi)部使用;在函數(shù)外部定義的結(jié)構(gòu)類型,其有效范圍從定義處開始,直到其所在的源程序文件結(jié)束。7【例9.1】構(gòu)建學(xué)生信息所需要的結(jié)構(gòu)體類型。程序如下:structstudent/*定義結(jié)構(gòu)體類型*/{intnum;/*學(xué)號為整型*/charname[20];/*姓名為字符串*/charsex[10];/*性別為字符串*/intage;/*年齡為整型*/intscore;/*成績?yōu)檎?/charaddr[30];/*地址為字符串*/};9.1.1定義結(jié)構(gòu)體類型8

9.1.2定義結(jié)構(gòu)體變量

結(jié)構(gòu)體類型是由若干的基本類型復(fù)合而成。在概念上必須清楚地認(rèn)識到,結(jié)構(gòu)體類型也只是一種類型,而不是變量實體。

為了能在程序中使用結(jié)構(gòu)體類型的數(shù)據(jù),還需要定義結(jié)構(gòu)體類型的變量,并在其中存放具體的數(shù)據(jù)。

定義結(jié)構(gòu)體類型變量的方法有三種。9.1.2定義結(jié)構(gòu)體變量9方法一:在定義結(jié)構(gòu)體類型的同時,定義變量。格式:struct結(jié)構(gòu)體名

{

數(shù)據(jù)類型

成員1;

數(shù)據(jù)類型

成員2;

……

數(shù)據(jù)類型

成員n;}變量1,變量2,……,變量n;9.1.2定義結(jié)構(gòu)體變量109.1.2定義結(jié)構(gòu)體變量【例9.2】定義兩個結(jié)構(gòu)體類型的變量。程序如下:structstudent{intnum;charname[20];charsex[10];intage;intscore;charaddr[30];}student1,student2;

以上程序中定義了兩個變量student1和student2,它們的類型為結(jié)構(gòu)體。11方法二:先定義結(jié)構(gòu)體的類型,再定義該類型的變量。格式:結(jié)構(gòu)體類型名

變量1,變量2,……,變量n;【例9.3】定義兩個結(jié)構(gòu)體類型的變量。程序如下:structstudent{intnum;charname[20];charsex[10];intage;intscore;charaddr[30];};structstudentstudent1,student2;9.1.2定義結(jié)構(gòu)體變量12方法三:不指定結(jié)構(gòu)體類型名,直接定義結(jié)構(gòu)體類型的變量。例9.2采用方法三程序如下:struct{intnum;charname[20];charsex[10];intage;intscore;charaddr[30];}student1,student2;

用這種形式來定義結(jié)構(gòu)體變量,只能使用一次,因為該結(jié)構(gòu)體類型沒有類型名,程序的其他位置就無法再次使用該類型去定義別的變量了。9.1.2定義結(jié)構(gòu)體變量139.1.3引用結(jié)構(gòu)體變量數(shù)據(jù)1.結(jié)構(gòu)體變量成員的引用

結(jié)構(gòu)體變量的運算都是基于它的成員變量。也就是說,要通過引用它的成員變量來進(jìn)行結(jié)構(gòu)體變量的運算。

引用結(jié)構(gòu)體變量中的成員的一般形式為:結(jié)構(gòu)體變量名.成員名

其中,“.”稱為成員運算符。在所有的運算符中,它的優(yōu)先級最高。注意:

如果結(jié)構(gòu)體變量的成員又是一個結(jié)構(gòu)體變量,則只能對最底層的成員進(jìn)行各種運算。在引用最底層的成員時,要增加成員運算符,一層一層地找到最底層的成員。9.1.3引用結(jié)構(gòu)體變量數(shù)據(jù)149.1.3引用結(jié)構(gòu)體變量數(shù)據(jù)【例9.4】在例9.1的基礎(chǔ)上,構(gòu)建學(xué)生年齡信息的結(jié)構(gòu)體類型。程序如下:structdate/*定義一個結(jié)構(gòu)體類型structdate*/{intmonth;/*月份*/intday;/*日期*/intyear;/*年份*/};structstudent/*定義一個結(jié)構(gòu)體類型structstudent*/{intnum;charname[20];charsex[10];intage;structdatebirthday;/*成員birthday屬于structdate類型*/charaddr[30];}student1,student2;152.結(jié)構(gòu)體變量的初始化

與基本類型的變量一樣,結(jié)構(gòu)體變量的初始化也可以通過賦值語句及相關(guān)函數(shù)的形式實現(xiàn)初始化。(1)通過賦值語句對結(jié)構(gòu)體變量的成員賦值。

方法一:定義變量的同時給變量的成員賦值。【例9.5】

定義結(jié)構(gòu)體類型的變量并對其成員賦初值。structstudent{intnum;charname[20];charsex[10];intage;intscore;charaddr[30];};structstudentstudent1={10001,"ZhangSan","male",21,91,"100wuhanroad"};9.1.3引用結(jié)構(gòu)體變量數(shù)據(jù)16方法二:同時定義結(jié)構(gòu)體類型和結(jié)構(gòu)體變量,并對結(jié)構(gòu)體變量的成員賦值。structstudent{intnum;charname[20];charsex[10];intage;intscore;charaddr[30];}student1={10001,"ZhangSan","male",21,91,"100wuhanroad"};9.1.3引用結(jié)構(gòu)體變量數(shù)據(jù)17(2)通過相關(guān)函數(shù)對結(jié)構(gòu)體變量的成員賦值。

【例9.6】對例9.2中的結(jié)構(gòu)體變量student1的成員進(jìn)行初始化。structstudent{intnum;charname[20];charsex[10];intage;intscore;charaddr[30];}student1;9.1.3引用結(jié)構(gòu)體變量數(shù)據(jù)18輸入學(xué)號可用:scanf("%d",&student1.num);輸入姓名可用:gets();或者scanf("%s",);輸入性別可用:gets(student1.sex);或者scanf("%s",student1.sex);輸入年齡可用:scanf("%d",student1.age);輸入成績可用:scanf("%d",student1.score);輸入家庭地址可用:gets(student1.addr);或者scanf("%s",&student1.addr);9.1.3引用結(jié)構(gòu)體變量數(shù)據(jù)19

9.2.1結(jié)構(gòu)體類型的數(shù)組結(jié)構(gòu)體數(shù)組是指每個數(shù)組元素都是一個結(jié)構(gòu)體變量,它們都分別包括各個成員項。例如:structstudent{intnum;charname[20];charsex[10];intage;intscore;charaddr[30];}student1,student2[2];

這里定義了structstudent結(jié)構(gòu)體類型的變量student1和結(jié)構(gòu)體類型的數(shù)組student2。9.2結(jié)構(gòu)體類型209.2.1結(jié)構(gòu)體類型的數(shù)組對結(jié)構(gòu)體數(shù)組進(jìn)行初始化,可采用以下兩種方式:方式1:通過賦值的方式對結(jié)構(gòu)體數(shù)組初始化structstudent{intnum;charname[20];charsex[10];intage;intscore;charaddr[30];}student2[2]={{10001,"ZhangSan","male",21,91,"100wuhanroad"},{10002,"LiSi","female",20,93,"31hepingroad"}};219.2.1結(jié)構(gòu)體類型的數(shù)組方式2:通過函數(shù)對結(jié)構(gòu)體數(shù)組初始化for(i=0;i<2;i++){scanf("%d",&student2[i].num);getchar();/*讀到回車符*/gets(student2[i].name);gets(student2[i].sex);scanf("%d",&student2[i].age);getchar();/*讀到回車符*/scanf("%d",&student2[i].score);getchar();/*讀到回車符*/gets(student2[i].addr);getchar();/*讀到回車符*/}229.2.2結(jié)構(gòu)體類型的指針9.2.2結(jié)構(gòu)體類型的指針

結(jié)構(gòu)體類型的指針,就是指向結(jié)構(gòu)體變量的指針,結(jié)構(gòu)體類型的指針中存放的是它所指向的結(jié)構(gòu)體變量的起始地址。

指向結(jié)構(gòu)體對象的指針變量既可以指向結(jié)構(gòu)體變量,也可以指向結(jié)構(gòu)體數(shù)組中的元素。

注意:

指針變量的類型必須與結(jié)構(gòu)體變量的類型一致。231.指向結(jié)構(gòu)體變量的指針例如:structstudent{

intnum;charname[20];charsex[10];intage;intscore;charaddr[30];}student1,student2[2],*p;

其中,*p即定義的結(jié)構(gòu)體類型的指針。9.2.2結(jié)構(gòu)體類型的指針24使用結(jié)構(gòu)體指針時需要注意:(1)結(jié)構(gòu)體指針必須先賦值后才能使用。賦值是把結(jié)構(gòu)體變量的首地址賦給該指針變量。(2)如果p已經(jīng)指向結(jié)構(gòu)體變量student1,則以下三種用法是等價的:p->num=10001;(*p).num=10001;student1.num=10001;

其中“->”稱為結(jié)構(gòu)體指針成員運算符,其作用是引用結(jié)構(gòu)體指針的成員。(3)如果結(jié)構(gòu)體指針已經(jīng)指向一個結(jié)構(gòu)體變量,就不能再使之指向結(jié)構(gòu)體變量的成員。9.2.2結(jié)構(gòu)體類型的指針259.2.2結(jié)構(gòu)體類型的指針【例9.8】通過結(jié)構(gòu)體指針引用前面例子中的結(jié)構(gòu)體變量。程序如下:#include<stdio.h>#include<string.h>structstudent{intnum;charname[20];charsex[10];intage;intscore;charaddr[30];};26voidmain(){structstudentstudent1,*p;p=&student1;student1.num=10001;strcpy(,"ZhangSan");strcpy(student1.sex,"male");student1.age=21;student1.score=91;strcpy(student1.addr,"100wuhanroad");printf("num:%d\nname:%s\nsex:%s\nage:%d\nscore:%d\naddr:%s\n",

(*p).num,(*p).name,(*p).sex,p—>age,p—>score,p—>addr);}9.2.2結(jié)構(gòu)體類型的指針272.指向結(jié)構(gòu)體數(shù)組的指針也可以用指針變量指向結(jié)構(gòu)體數(shù)組的元素。【例9.9】有3個學(xué)生的信息,放在結(jié)構(gòu)體數(shù)組中,要求輸出這3個學(xué)生的信息。程序如下:#include<stdio.h>structstudent{intnum;charname[20];charsex[10];intage;intscore;charaddr[30];};9.2.2結(jié)構(gòu)體類型的指針28structstudentstudent1[3]={{10001,"ZhangSan","male",21,91,"100wuhanroad"},{10002,"LiSi","female",20,93,"31hepingroad"},

{10003,"WangWu","male",20,86,"76youyiroad"}};voidmain(){structstudent*p;for(p=student1;p<student1+3;p++)printf("numnamesexagescoreaddr\n");printf("%5d%-20s%-10s%4d%6d%-30s\n",p—>num,p—>name,p—>sex,p—>age,p—>score,p—>addr);}9.2.2結(jié)構(gòu)體類型的指針程序運行結(jié)果:293.用結(jié)構(gòu)體變量作函數(shù)參數(shù)

將一個結(jié)構(gòu)體變量的值傳遞給另一個函數(shù),可用以下三種方法:用結(jié)構(gòu)體變量的成員作參數(shù)。其用法和用普通變量作實參是一樣的,屬于“值傳遞”方式。(2)用結(jié)構(gòu)體變量作實參。用結(jié)構(gòu)體變量作實參時,采取的也是“值傳遞”方式,將結(jié)構(gòu)體變量所占的內(nèi)存單元的內(nèi)容全部按順序傳遞給形參,形參也必須是同類型的結(jié)構(gòu)體變量。(3)用指向結(jié)構(gòu)體變量(或數(shù)組元素)的指針作實參,將結(jié)構(gòu)體變量(或數(shù)組元素)的地址傳給形參。9.2.2結(jié)構(gòu)體類型的指針309.2.3鏈表1.鏈表概述

使用數(shù)組存放一組同類型的數(shù)據(jù)時,其元素的個數(shù)在定義時必須指定,大小不能改變,換成鏈表來處理這組數(shù)據(jù),則沒有這種缺點。

鏈表是一種常見的重要的數(shù)據(jù)結(jié)構(gòu)。在C語言中,利用結(jié)構(gòu)體的遞歸就可以實現(xiàn)動態(tài)存儲分配,它可以使不占連續(xù)內(nèi)存單元的數(shù)據(jù)連接起來,構(gòu)成動態(tài)的數(shù)據(jù)結(jié)構(gòu)。這種數(shù)據(jù)結(jié)構(gòu)稱為鏈表,它是根據(jù)需要來開辟內(nèi)存單元的。9.2.3鏈表31

最簡單的一種單向鏈表結(jié)構(gòu):

圖中head表示鏈表中的“頭指針”變量,它存放一個地址,該地址指向一個元素。鏈表中每一個元素稱為“結(jié)點”,每個結(jié)點包含兩個部分:(1)用戶需要的實際數(shù)據(jù);(2)下一個結(jié)點的地址。鏈表中的第一個結(jié)點稱為“表頭”,鏈表的最后一個結(jié)點稱為“表尾”。從圖中可以看出,“表頭”指向第一個元素,第一個元素又指向第二個元素,……,直到鏈表的最后一個元素。“表尾”不再指向任何其它元素,其地址部分存放一個空地址“NULL”,鏈表到此結(jié)束。9.2.3鏈表32

鏈表中各元素在內(nèi)存中的地址可以是不連續(xù)的。要找某一個元素,必須先找到上一個元素,根據(jù)它提供的下一個元素的地址才能找到下一個元素。如果沒有提供“頭指針”head,則整個鏈表都無法訪問。

可以利用指針變量來實現(xiàn)鏈表的這種數(shù)據(jù)結(jié)構(gòu),即一個結(jié)點應(yīng)包含有一個指針變量,用它存放下一個結(jié)點的地址。9.2.3鏈表33

定義鏈表結(jié)點,可以采用以下形式:structstudent{intnum;intscore;structstudent*next;};

其中,成員num和成員score存放的是用戶需要的數(shù)據(jù),稱為數(shù)據(jù)域;而next是指針類型的成員,稱為指針域,它指向structstudent類型數(shù)據(jù)。9.2.3鏈表342.動態(tài)存儲分配函數(shù)(1)內(nèi)存分配函數(shù)malloc(size)

作用是在內(nèi)存的動態(tài)存儲區(qū)中分配一個長度為size的連續(xù)空間。形參size的類型為無符號整型(不允許為負(fù)數(shù))。函數(shù)的返回值是所分配區(qū)域的第一個字節(jié)的地址,即此函數(shù)為一個指針型函數(shù)。(2)釋放內(nèi)存函數(shù)free(p)

作用是釋放指針變量p所指向的動態(tài)空間地,使這部分空間能夠重新被其他變量使用。p必須為最近一次調(diào)用malloc函數(shù)時得到的返回值。

上面兩個函數(shù)在頭文件stdlib.h中,使用時應(yīng)當(dāng)有包含語句“#include<stdlib.h>”。9.2.3鏈表353.鏈表的建立

建立鏈表是指在程序執(zhí)行過程中從無到有地建立起一個鏈表,即一個一個地開辟結(jié)點和輸入各結(jié)點數(shù)據(jù),并建立起前后結(jié)點相鏈的關(guān)系。

建立鏈表的過程是先建立鏈表的頭結(jié)點,并將該頭結(jié)點作為尾結(jié)點,然后不斷增加新結(jié)點,將新增的結(jié)點連接在當(dāng)前尾結(jié)點的后面作為新的尾結(jié)點。為此,建立鏈表時需要設(shè)置三個指針,分別指向鏈表的頭結(jié)點、新建結(jié)點和尾結(jié)點。9.2.3鏈表36建立鏈表的過程如下:(1)定義三個結(jié)構(gòu)體指針變量h、p1和p2。(2)使用malloc函數(shù)申請一段存儲空間存放頭結(jié)點,將該存儲空間的起始地址存放在指針h中,且其數(shù)據(jù)域和指針域均為空,并使p1和p2同時指向頭結(jié)點,表示該結(jié)點既是頭結(jié)點,也是當(dāng)前結(jié)點,又是尾結(jié)點。(3)向當(dāng)前結(jié)點數(shù)據(jù)域輸入數(shù)據(jù)。(4)若輸入數(shù)據(jù)為結(jié)束標(biāo)志,則轉(zhuǎn)至(7);否則繼續(xù)。(5)再次使用malloc函數(shù)申請一段存儲空間存放下一個新建結(jié)點,該存儲空間的起始地址存放在指針p1中。向p1結(jié)點數(shù)據(jù)域輸入數(shù)據(jù),并將p1結(jié)點的起始地址存入p2結(jié)點的指針域,這樣,p1結(jié)點被鏈接在p2結(jié)點之后。再將p1起始地址存入指針p2使新建結(jié)點成為新的尾結(jié)點。(6)返回(3)。(7)結(jié)束建立鏈表,并在尾結(jié)點的指針域中放入NULL,作為鏈表結(jié)束的標(biāo)記。9.2.3鏈表37【例9.11】將鍵盤輸入的非0整數(shù)依次存入鏈表各個結(jié)點的數(shù)據(jù)域中,當(dāng)輸入整數(shù)0時,結(jié)束建立鏈表。程序如下:#include<stdio.h>#include<stdlib.h>structnode/*結(jié)點*/{intdata;/*結(jié)點數(shù)據(jù)域*/structnode*next;/*結(jié)點指針域*/};structnode*creatlist()/*建立鏈表函數(shù)*/{structnode*h,*p1,*p2;/*定義三個結(jié)構(gòu)體指針變量*/inta;h=(structnode*)malloc(sizeof(structnode));/*頭結(jié)點*/p1=p2=h;9.2.3鏈表38scanf(“%d",&a);/*從鍵盤輸入一個整數(shù)*/while(a!=0){p1=(structnode*)malloc(sizeof(structnode));/*插入結(jié)點起始地址*/p1—>data=a;/*向結(jié)點數(shù)據(jù)域輸入數(shù)據(jù)*/p2—>next=p1;/*將當(dāng)前結(jié)點作為新的尾結(jié)點*/scanf("%d",&a);}p2—>next=NULL;/*在尾結(jié)點放入結(jié)束標(biāo)記*/return(h);}voidmain(){structnode*head;head=creatlist();/*創(chuàng)建鏈表并保存鏈表起始地址*/}9.2.3鏈表394.鏈表的輸出

輸出鏈表的過程是根據(jù)鏈表的頭結(jié)點找到下一個結(jié)點,先輸出數(shù)據(jù)域中的數(shù)據(jù),然后根據(jù)指針域中的地址,取出后繼結(jié)點,輸出其中的數(shù)據(jù),直到鏈表的末尾。

輸出鏈表的過程如下:(1)根據(jù)調(diào)用函數(shù)傳遞來的鏈表首地址找到該鏈表的頭結(jié)點。(2)由頭結(jié)點的指針域中的地址找到下一個結(jié)點。(3)若結(jié)點在指針域中的地址不是NULL,輸出其中的數(shù)據(jù),并繼續(xù)找下一個結(jié)點;若指針域中的地址為NULL,返回調(diào)用函數(shù)。9.2.3鏈表40

【例9.12】依次輸出例9.11中鏈表各結(jié)點的數(shù)據(jù)。

程序如下:voidprintlist(structnode*h)/*輸出鏈表函數(shù)*/{structnode*p1;p1=h—>next;/*取頭結(jié)點之后一結(jié)點*/while(p1!=NULL){printf("%d",p1—>data);p1=p1—>next;/*繼續(xù)取后繼結(jié)點*/}printf("\n");return;}然后在函數(shù)中調(diào)用輸出鏈表函數(shù)即可。9.2.3鏈表419.3共用體類型1.共用體的定義與意義

共用體又稱聯(lián)合體(union),是幾個不同類型的變量共享同一段內(nèi)存單元的一種存儲結(jié)構(gòu),這些不同類型的變量在內(nèi)存中所占用的起始單元相同。

共用體聲明的一般形式為:union共用體名{

類型1成員1;

類型2成員2;

類型n成員n;};429.3共用體類型例如:uniondata{inti;charch;floatf;};

聲明一個名為data的共用體類型,共有3個成員:成員i為整型,成員ch為字符型,成員f為實型,這3個成員共用一段內(nèi)存且起始地址是相同的。說明:結(jié)構(gòu)體變量所占內(nèi)存大小是所有成員所占內(nèi)存大小的總和;而共用體變量所占內(nèi)存大小等于它最長成員的長度。432.共用體變量的定義

共用體變量的定義形式與結(jié)構(gòu)體類似,可以采用如下三種方法:

(1)定義共用體時同時定義其變量

(2)先定義共用體后定義變量。

(3)直接定義共用體類型變量。9.3共用體類型443.共用體變量的引用

共用體變量只有先定義了才能引用。共用體變量的引用與結(jié)構(gòu)體變量一樣,不能直接引用共用體變量,而只能引用共用體變量中的成員,如a.i、b.f。

以下的引用是錯誤的:printf("%d",a);

因為a的存儲區(qū)中包含有不同類型的數(shù)據(jù),系統(tǒng)無從判別究竟應(yīng)該輸出哪一個成員的值。9.3共用體類型454.共用體類型數(shù)據(jù)的特點

共用體類型的數(shù)據(jù)具有以下特點,使用中要加以注意:(1)系統(tǒng)采用覆蓋技術(shù)實現(xiàn)共用體變量各成員的內(nèi)存共享,所以某一時刻,存放和起作用的是最后一次存入的成員值。在對共用體變量中的一個成員賦值后,原有變量存儲單元中的值就被取代。(2)與結(jié)構(gòu)體變量不同,不能對共用體變量進(jìn)行初始化,但可以對共用體變量中指定的某一個成員初始化。(3)由于所有成員共享同一個內(nèi)存空間,所以共用體變量的地址與其各成員的地址都是同一個地址。如&a,&a.i,&a.ch,&a.f都是同一值。(4)共用體類型可以出現(xiàn)在結(jié)構(gòu)體類型定義中,也可以定義共用體數(shù)組。反之,結(jié)構(gòu)體也可以出現(xiàn)在共用體類型定義中,數(shù)組也可以作為共用體的成員。9.3共用體類型469.3共用體類型【例9.13】利用共用體成員共享存儲單元的特點,將int類型數(shù)據(jù)的高字節(jié)和低字節(jié)進(jìn)行分離。

程序如下:#include<stdio.h>unionun/*共用體類型聲明*/{inta;/*共用體成員a*/charch[2];/*共用體成員ch*/}data;/*定義共用體類型變量data*/voidmain(){scanf("%x",&data.a);printf("%x%x\n",data.ch[0],data.ch[1]);}479.4枚舉類型

如果一個變量只有有限幾種可能的值,就可以將它定義成枚舉類型變量。所謂“枚舉”是將變量可能的值一一列舉出來,變量的值只限于列舉值的范圍內(nèi)。1.枚舉類型及枚舉變量的定義

枚舉類型的定義形式為:

enum枚舉名{枚舉元素列表};

其中,enum為關(guān)鍵字,enum連同枚舉名一起稱為枚舉類型名,枚舉元素名為一個個由用戶自行定義的標(biāo)識符。

枚舉變量的定義與結(jié)構(gòu)體變量及共用體變量的定義方式一樣,即:枚舉類型名枚舉變量名。482.枚舉元素的取值(1)枚舉元素是常量而不是變量,所以不能對枚舉元素賦值。它們的值只能在定義或初始化時獲得。(2)枚舉元素若未初始化,則按各元素在定義時的排列次序依次從0開始取值。(3)每一個枚舉元素都代表一個整數(shù),可以在初始化時人為指定各元素的取值,也可以只對部分枚舉元素初始化,未初始化的枚舉元素取值比它前面的元素大1。9.4枚舉類型49【例9.14】利用枚舉變量作循環(huán)變量和數(shù)組下標(biāo)。程序如下:#include<stdio.h>enumcoin{penny,nickel,dime,quarter,half_dollar,dollar};/*定義枚舉類型enumcoin*/charname[][10]={“January”,“February”,“March”,“April”,“May”,“June”,“July”,“August”,“September”,“October”,“November”,“December”};/*定義字符數(shù)組name并初始化*/voidmain(){enumcoini;for(i=Penny;i<=dollar;i++)/*枚舉元素未初始化,penny默認(rèn)為0,dollar默認(rèn)為5*/printf("%s",name[i]);}9.4枚舉類型程序運行結(jié)果:Ja

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論