孫鑫vc教程之第05節(jié) 結(jié)構(gòu)體、聯(lián)合體、枚舉_第1頁(yè)
孫鑫vc教程之第05節(jié) 結(jié)構(gòu)體、聯(lián)合體、枚舉_第2頁(yè)
孫鑫vc教程之第05節(jié) 結(jié)構(gòu)體、聯(lián)合體、枚舉_第3頁(yè)
孫鑫vc教程之第05節(jié) 結(jié)構(gòu)體、聯(lián)合體、枚舉_第4頁(yè)
孫鑫vc教程之第05節(jié) 結(jié)構(gòu)體、聯(lián)合體、枚舉_第5頁(yè)
已閱讀5頁(yè),還剩44頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、第五節(jié)、結(jié)構(gòu)體、聯(lián)合體、枚舉目標(biāo):1、結(jié)構(gòu)體應(yīng)用2、聯(lián)合體應(yīng)用3、枚舉的應(yīng)用4、自定義數(shù)據(jù)類型一、 結(jié)構(gòu)體類型學(xué)號(hào)姓名性別年齡身份證號(hào)家庭住址家庭聯(lián)系電話11301pin.zhangF19320406841001264changzhou(0519)875426711302min.liM20612301830314261xian(029)3870909例子:新生入學(xué)登記表,要記錄每個(gè)學(xué)生的學(xué)號(hào),姓名,性別,年齡,身份證號(hào),家庭住址,家庭聯(lián)系 等信息。 使用數(shù)組: 因?yàn)橐泻芏鄬W(xué)生的信息要處理,按照我們前面學(xué)習(xí)過(guò)的知識(shí),這個(gè)任務(wù)要使用數(shù)組。但是數(shù)組是由相同類型的數(shù)據(jù)構(gòu)成。所以我們可以使用7個(gè)單獨(dú)的

2、數(shù)組學(xué)號(hào)數(shù)組no、姓名數(shù)組name、性別數(shù)組sex、年齡數(shù)組age、身份證號(hào)數(shù)組pno、家庭住址數(shù)組addr、家庭聯(lián)系 數(shù)組tel分別保存這幾類信息。分立的幾個(gè)數(shù)組將給數(shù)據(jù)的處理造成麻煩,但很多計(jì)算機(jī)語(yǔ)言只能這樣處理如:早期的FORTRAN,PASCAL,BASIC。 使用結(jié)構(gòu)體: C語(yǔ)言利用結(jié)構(gòu)體將同一個(gè)對(duì)象的不同類型屬性數(shù)據(jù),組成一個(gè)有聯(lián)系的整體。也就是說(shuō)可以定義一種結(jié)構(gòu)體類型將屬于同一個(gè)對(duì)象的不同類型的屬性數(shù)據(jù)組合在一起。本例可以將屬于同一個(gè)學(xué)生的各種不同類型的屬性數(shù)據(jù)組合在一起,形成整體的結(jié)構(gòu)體類型數(shù)據(jù)??梢杂媒Y(jié)構(gòu)體類型變量存儲(chǔ)、處理單個(gè)學(xué)生的信息。 結(jié)構(gòu)體是一種自定義數(shù)據(jù)類型。如果要

3、存儲(chǔ)、處理多個(gè)學(xué)生對(duì)象的信息,可以使用數(shù)組元素為結(jié)構(gòu)體類型的數(shù)組,其中每個(gè)元素是一個(gè)學(xué)生對(duì)象的相關(guān)的整體的信息。 1結(jié)構(gòu)體類型和結(jié)構(gòu)體變量 結(jié)構(gòu)體是一種構(gòu)造類型自定義類型,除了結(jié)構(gòu)體變量需要定義后才能使用外,結(jié)構(gòu)體的類型本身也需要定義。結(jié)構(gòu)體由假設(shè)干“成員組成。每個(gè)成員可以是一個(gè)根本的數(shù)據(jù)類型,也可以是一個(gè)已經(jīng)定義的構(gòu)造類型。1、結(jié)構(gòu)體類型定義的一般形式struct 結(jié)構(gòu)體名 類型1 成員1; 類型2 成員2; . 類型n 成員n; 說(shuō)明:1結(jié)構(gòu)體名:結(jié)構(gòu)體類型的名稱。遵循標(biāo)識(shí)符規(guī)定。2結(jié)構(gòu)體有假設(shè)干數(shù)據(jù)成員,分別屬于各自的數(shù)據(jù)類型,結(jié)構(gòu)體成員名同樣遵循標(biāo)識(shí)符規(guī)定,它屬于特定的結(jié)構(gòu)體變量對(duì)象,

4、名字可以與程序中其它變量或標(biāo)識(shí)符同名。3使用結(jié)構(gòu)體類型時(shí),struct 結(jié)構(gòu)體名作為一個(gè)整體,表示名字為“結(jié)構(gòu)體名的結(jié)構(gòu)體類型。4結(jié)構(gòu)體類型的成員可以是根本數(shù)據(jù)類型,也可以是其它的已經(jīng)定義的結(jié)構(gòu)體類型-結(jié)構(gòu)體嵌套。結(jié)構(gòu)體成員的類型不能是正在定義的結(jié)構(gòu)體類型遞歸定義,結(jié)構(gòu)體大小不能確定,但可以是正在定義的結(jié)構(gòu)體類型的指針。例如:定義關(guān)于學(xué)生信息的結(jié)構(gòu)體類型。struct student int no; char name20; char sex; int age; char pno19; char addr40; char tel10;; 說(shuō)明:1struct student是結(jié)構(gòu)體類型名,st

5、ruct是關(guān)鍵詞,在定義和使用時(shí)均不能省略。2該結(jié)構(gòu)體類型由7個(gè)成員組成,分別屬于不同的數(shù)據(jù)類型,分號(hào)“;不能省略。成員含義同前。3在定義了結(jié)構(gòu)體類型后,可以定義結(jié)構(gòu)體變量int整型類型,可以定義整型變量。 4由于結(jié)構(gòu)體是一種自定義的數(shù)據(jù)類型,概 念上等同于int,char等數(shù)據(jù)類型。 因此,定義了結(jié)構(gòu)體后,并不分配內(nèi)存空間。只有定義了結(jié)構(gòu)體變量后,才分配內(nèi)存空間。定義了結(jié)構(gòu)體,只是知道了結(jié)構(gòu)體數(shù)據(jù)類型的大小。 2、結(jié)構(gòu)體變量的定義三種方法1先定義結(jié)構(gòu)體類型,再定義結(jié)構(gòu)體變量概念、含義相當(dāng)清晰,即: 結(jié)構(gòu)體類型定義; 結(jié)構(gòu)體變量定義; 其中:結(jié)構(gòu)體變量定義:struct 結(jié)構(gòu)體類型名 結(jié)構(gòu)體變

6、量名;例如:struct student.; /* 類型定義,定義結(jié)構(gòu)體類型struct student */struct student student1,student2; /* 變量定義,定義2個(gè)類型為struct student的結(jié)構(gòu)體變量student1,student2 */2定義結(jié)構(gòu)體類型的同時(shí)定義結(jié)構(gòu)體變量。struct 結(jié)構(gòu)體名 .(成員).結(jié)構(gòu)體變量名表;在這里定義屬于結(jié)構(gòu)體類型的變量例如:struct student.student1,student2;說(shuō)明:這一種緊湊的格式,既定義類型,也定義變量;如果需要,在程序中還可以使用所定義的結(jié)構(gòu)體類型,定義其它同類型變量。(3

7、)直接定義結(jié)構(gòu)體變量不給出結(jié)構(gòu)體類型名,匿名的結(jié)構(gòu)體類型Struct .(成員).結(jié)構(gòu)體變量名表;例如:struct.student1,student2;結(jié)構(gòu)體類型、變量是不同的概念:在定義時(shí)一般先定義一個(gè)結(jié)構(gòu)體類型,然后定義變量為該類型;賦值、存取或運(yùn)算只能對(duì)變量,不能對(duì)類型;編譯時(shí)只對(duì)變量分配空間,對(duì)類型不分配空間。結(jié)構(gòu)體變量的引用1、引用結(jié)構(gòu)體變量中的一個(gè)成員結(jié)構(gòu)體變量名.成員名其中:“.運(yùn)算符是成員運(yùn)算符。例如:student1.num=11301;scanf(“%s,); if(strstr(student1.addr,shanxi)!=NULL).;stu

8、dent1.age+;2、成員本身又是結(jié)構(gòu)體類型時(shí)的子成員的訪問(wèn)-使用成員運(yùn)算符逐級(jí)訪問(wèn)。例如:3、同一種類型的結(jié)構(gòu)體變量之間可以直接賦值(整體賦值,成員逐個(gè)依次賦值)。例如:student2=student1;4、不允許將一個(gè)結(jié)構(gòu)體變量整體輸入/輸出例如:scanf(“%.,&student1); printf(“%.,student1); 都是錯(cuò)誤的。3結(jié)構(gòu)體變量的初始化結(jié)構(gòu)體變量也可以在定義時(shí)進(jìn)行初始化,但是變量后面的一組數(shù)據(jù)應(yīng)該用“括起來(lái),其順序也應(yīng)該與結(jié)構(gòu)體中的成員順序保持一致。main() struct student int no; char name20; char sex;

9、int age; char pno19; char addr40; char tel20; student1 = 11301,Zhang Ping,F,19, 320406841001264,changzhou,(0519)8754267; printf(no=%d,name=%s,sex=%c,age=%d,pno=%snaddr=%s,tel=%sn, student1.no,,student1.sex,student1.age, student1.pno,student1.addr,student1.tel);結(jié)果:no=11301,name=Zhang Pin

10、g,sex=F,age=19,pno=320406841001264addr=changzhou,tel=(0519)8754267本例中,結(jié)構(gòu)體變量student1在定義的同時(shí),其各個(gè)成員也按順序被賦予了相應(yīng)的一組數(shù)據(jù)。4、結(jié)構(gòu)體與數(shù)組的比較 我們前面學(xué)過(guò)數(shù)組,數(shù)組是同種類型的變量的集合,占用一個(gè)連續(xù)的空間。而結(jié)構(gòu)體,我們通過(guò)結(jié)構(gòu)體的定義,我們可以看到,結(jié)構(gòu)體也是一些變量的集合,不過(guò)是不同類型的變量的集合。不同的類型,大小也不一致。那么他們的排列就會(huì)有一個(gè)對(duì)齊的問(wèn)題。 我們看例子:typedef struct _tagData char a;int b;DATA;int main(int a

11、rgc, char* argv)DATA aa;aa.a = a;aa.b = 1000;printf(sizeof(aa) = %dn,sizeof(aa);printf(aa.a = %#x,aa.b = %#xn,&aa.a,&aa.b);return 0;運(yùn)行結(jié)果: 例子顯示結(jié)構(gòu)體DATA中的大小是8字節(jié),可是通過(guò)結(jié)構(gòu)體的定義,我們看到只有5個(gè)字節(jié)。 在結(jié)構(gòu)體變量中,a的地址是0 x12ff78,而b的地址是0 x12ff7c,這中間有三個(gè)字節(jié)空間沒(méi)有使用。答案就是,它確實(shí)沒(méi)有使用,原因是32位的cpu通常是4字節(jié)的整數(shù)倍的內(nèi)存地址中讀取數(shù)據(jù)的。所以編譯器為了優(yōu)化代碼,往往會(huì)根據(jù)變量的

12、大小,將其指定到適宜的位置,這就是我們說(shuō)的內(nèi)存對(duì)齊。例如:structchar a;int b;char c;int d;char e;int f;char g;int i;X;structchar a;char c;char e;char g;int b;int d; int f;int i;Y;這兩個(gè)結(jié)構(gòu)體,定義上是完全一樣的,只是兩者在內(nèi)部排列順序上不一致。我們計(jì)算這兩個(gè)變量X,Y的大小時(shí),得到的結(jié)果如下:我們可以看到,不同的排列導(dǎo)致結(jié)構(gòu)體占用的內(nèi)存大小不一樣,差異非常明顯。因此,我們?cè)诙x結(jié)構(gòu)體時(shí),要遵循:同種類型的定義放在一起。如:Y的定義那樣。5、結(jié)構(gòu)體數(shù)組結(jié)構(gòu)體數(shù)組-數(shù)組元素的類

13、型為結(jié)構(gòu)體類型的數(shù)組。C語(yǔ)言允許使用結(jié)構(gòu)體數(shù)組存放一類對(duì)象的數(shù)據(jù)。i.結(jié)構(gòu)體數(shù)組的定義類似結(jié)構(gòu)體變量定義,只是將“變量名用“數(shù)組名長(zhǎng)度代替,也有3種方式。1、先定義結(jié)構(gòu)體類型,然后定義結(jié)構(gòu)體數(shù)組:struct 結(jié)構(gòu)體名 .; struct 結(jié)構(gòu)體名 結(jié)構(gòu)體數(shù)組名;2、定義結(jié)構(gòu)體類型同時(shí)定義結(jié)構(gòu)體數(shù)組:struct 結(jié)構(gòu)體名 .結(jié)構(gòu)體數(shù)組名數(shù)組的長(zhǎng)度;3、匿名結(jié)構(gòu)體類型struct .結(jié)構(gòu)體數(shù)組名數(shù)組的長(zhǎng)度;例如:定義30個(gè)元素的結(jié)構(gòu)體數(shù)組stu,其中每個(gè)元素都是 struct student類型。 struct student char name20; char sex; char pno19

14、; char addr40; char tel20; int age; int no;stu30;定義了結(jié)構(gòu)體數(shù)組后,可以采用:數(shù)組元素.成員名。引用結(jié)構(gòu)體數(shù)組某個(gè)元素的成員,結(jié)構(gòu)體數(shù)組的初始化.在對(duì)結(jié)構(gòu)體數(shù)組初始化時(shí),要將每個(gè)元素的數(shù)據(jù)用“括起來(lái)。6結(jié)構(gòu)體指針變量結(jié)構(gòu)體指針變量:指向結(jié)構(gòu)體變量的指針變量。結(jié)構(gòu)體指針變量的值是結(jié)構(gòu)體變量在內(nèi)存中的起始地址。 結(jié)構(gòu)體變量a P 結(jié)構(gòu)體指針變量ii.結(jié)構(gòu)體指針變量1結(jié)構(gòu)體指針變量的定義: struct 結(jié)構(gòu)體名 *結(jié)構(gòu)體指針變 量名;例如: struct student *p;定義了一個(gè)結(jié)構(gòu)體指針變量,它可 以指向一個(gè)struct student結(jié)

15、構(gòu)體類型的數(shù)據(jù)。2通過(guò)結(jié)構(gòu)體指針變量訪問(wèn)結(jié)構(gòu)體變量的成員:(兩種訪問(wèn)形式)(1)*結(jié)構(gòu)體指針變量名.成員名。理解:*結(jié)構(gòu)體指針變量名=所指向的結(jié)構(gòu)體變量名,注意:“.運(yùn)算符優(yōu)先級(jí)比“*運(yùn)算符高(2) 結(jié)構(gòu)體指針變量名-成員名其中:“-是指向成員運(yùn)算符,很簡(jiǎn)潔,更常用例如:可以使用(*p).age或p-age訪問(wèn)p指向的結(jié)構(gòu)體的age成員。例3:用指針訪問(wèn)結(jié)構(gòu)體變量及結(jié)構(gòu)體數(shù)組數(shù)組的指針就是指向其元素的指針,訪問(wèn)數(shù)組元素和訪問(wèn)變量所需要定義的指針變量完全相同;指向數(shù)組元素和指向變量的指針變量在使用上也完全相同。參見(jiàn):example3iii.結(jié)構(gòu)體變量、結(jié)構(gòu)體指針變量作函數(shù)參數(shù) 結(jié)構(gòu)體變量、結(jié)構(gòu)體

16、指針變量都可以像其它數(shù)據(jù)類型一樣作為函數(shù)的參數(shù),也可以將函數(shù)定義為結(jié)構(gòu)體類型或結(jié)構(gòu)體指針類型返回值為結(jié)構(gòu)體、結(jié)構(gòu)體指針類型。例4:對(duì)年齡在19歲以下含19歲同學(xué)的成績(jī)?cè)黾?0分。 參見(jiàn):example2二 聯(lián)合體聯(lián)合,共同體聯(lián)合體:將不同類型的數(shù)據(jù)項(xiàng)存放于同一段內(nèi)存 單元的一種構(gòu)造數(shù)據(jù)類型。 與結(jié)構(gòu)類似,在聯(lián)合體內(nèi)可以定義多種不同數(shù)據(jù)類型的成員;區(qū)別是,在聯(lián)合體類型變量所有成員共用一塊內(nèi)存單元。雖然每個(gè)成員都可以被賦值,但只有最后一次賦予的成員值能夠保存且有意義,前面賦予的成員值被后面賦予的成員值所覆蓋iv.聯(lián)合體類型、聯(lián)合體類型變量的定義1、聯(lián)合體類型定義的一般形式:union 聯(lián)合體名 類

17、型1 成員1; 類型2 成員2; . 類型n 成員n;2、聯(lián)合體類型變量的定義,方法同結(jié)構(gòu)體變量的定義三種形式,同時(shí),前后,匿名例如:/*定義聯(lián)合體類型data*/union data int a; float b; char c;/*定義聯(lián)合體變量*/union data x,y;x.cx.ax.bxv.聯(lián)合體變量的引用對(duì)聯(lián)合體變量的賦值,使用都是對(duì)變量的成員進(jìn)行的,聯(lián)合體變量的成員表示為:聯(lián)合體變量名.成員名使用聯(lián)合體類型數(shù)據(jù)時(shí)應(yīng)注意聯(lián)合體數(shù)據(jù)的特點(diǎn): 1同一內(nèi)存段可以用來(lái)存放不同類型的成員,但是每一瞬時(shí)只能存放其中的一種也只有一種有意義。 2聯(lián)合體變量中有意義的成員是最后一次存放的成員。

18、例如:在x.a=1;x.b=3.6;x.c=H語(yǔ)句后;當(dāng)前只有x.c有意義x.a,x.b也可以訪問(wèn),但沒(méi)有實(shí)際意義。 3聯(lián)合體變量的地址和它的成員的地址都是同一地址。即,&x.a=&x.b=&x.c=&x。4除整體賦值外,不能對(duì)聯(lián)合體變量進(jìn)行賦值,也不能企圖引用聯(lián)合體變量來(lái)得到成員的值。不能在定義聯(lián)合體變量時(shí)對(duì)聯(lián)合體變量進(jìn)行初始化系統(tǒng)不清楚是為哪個(gè)成員賦初值;5可以將聯(lián)合體變量作為函數(shù)參數(shù),函數(shù)也可以返回聯(lián)合體,聯(lián)合體指針。6聯(lián)合體,結(jié)構(gòu)體可以相互嵌套。例10:學(xué)校的人員數(shù)據(jù)管理,教師的數(shù)據(jù)包括:編號(hào)、姓名、性別、職務(wù)。學(xué)生的數(shù)據(jù)包括:編號(hào)、姓名、性別、班號(hào)。如果將兩種數(shù)據(jù)放在同一個(gè)表格中,那

19、么有一欄,對(duì)于教師登記教師的“職務(wù),對(duì)于學(xué)生那么登記學(xué)生的“班號(hào)對(duì)于同一人員不可能同時(shí)出現(xiàn)。寫出類型定義。解: Struct person Int no; Char name20; Bool sex; Union char banhao20; char zhiwu20; ; ;三 枚舉類型枚舉類型:只能取事先定義值的數(shù)據(jù)類型是枚舉類型。1、枚舉類型定義enum 枚舉類型名枚舉元素或:枚舉常量列表;2、枚舉變量定義類似結(jié)構(gòu)體變量定義3種形式1定義枚舉類型的同時(shí)定義變量:enum 枚舉類型名枚舉常量列表枚舉變量列表;2先定義類型后定義變量:enum 枚舉類型名 枚舉變量列表;3匿名枚舉類型:enu

20、m 枚舉常量列表枚舉變量列表;例如:enum weekdaysun,mon,tue,wed,thu,fri,sat;/* 定義枚舉類型enum weekday,取值范圍:sun,mon.sat。*/enum weekday week1,week2;/* 定義enum weekday枚舉類型的變量week1,week2,其取值范圍:sun,mon,.,sat。*/week1=wed; week2=fri;/* 可以用枚舉常量給枚舉變量賦值 */3、關(guān)于枚舉的說(shuō)明:1enum是標(biāo)識(shí)枚舉類型的關(guān)鍵詞,定義枚舉類型時(shí)應(yīng)當(dāng)用enum開(kāi)頭。2枚舉元素枚舉常量由程序設(shè)計(jì)者自己指定,命名規(guī)那么同標(biāo)識(shí)符。這些名

21、字是符號(hào),可以提高程序的可讀性。3枚舉元素在編譯時(shí),按定義時(shí)的排列順序取值0,1,2.。類似整型常數(shù)4枚舉元素是常量,不是變量看似變量,實(shí)為常量,可以將枚舉元素賦值給枚舉變量。但是不能給枚舉常量賦值。在定義枚舉類型時(shí)可以給這些枚舉常量指定整型常數(shù)值未指定值的枚舉常量的值是前一個(gè)枚舉常量的值+1。例如:enum weekdaysun=7,mon=1,tue,wed,thu,fri,sat;5枚舉常量不是字符串。6枚舉變量,常量一般可以參與整數(shù)可以參與的運(yùn)算。如算術(shù)運(yùn)算/關(guān)系/賦值等運(yùn)算。例如:不要希望week1=sun;printf(“%s,week1);能打印出“sun,.,可以用下面語(yǔ)句檢查輸

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(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ì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論