第八節(jié) 結(jié)構(gòu)體_第1頁(yè)
第八節(jié) 結(jié)構(gòu)體_第2頁(yè)
第八節(jié) 結(jié)構(gòu)體_第3頁(yè)
第八節(jié) 結(jié)構(gòu)體_第4頁(yè)
第八節(jié) 結(jié)構(gòu)體_第5頁(yè)
已閱讀5頁(yè),還剩33頁(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、問(wèn)題的提出,結(jié)構(gòu)體類型與結(jié)構(gòu)體變量,結(jié)構(gòu)體數(shù)組,結(jié)構(gòu)體與函數(shù),共用體,第,8,章,結(jié)構(gòu)體與共用體,8.1,問(wèn)題的提出,學(xué)號(hào),姓名,性別,入學(xué)時(shí)間,計(jì)算機(jī)原理,C,語(yǔ)言,編譯原理,操作系統(tǒng),1,令狐沖,男,2006,90,83,72,82,2,林平之,男,2006,78,92,88,78,3,岳靈珊,女,2006,89,72,98,66,4,任瑩瑩,女,2006,78,95,87,90,5,6,如果只存儲(chǔ)某班的某門課程的成績(jī),可使用一維數(shù),組;只存儲(chǔ)若干門課程的成績(jī),可用二維數(shù)組;對(duì)于,下表該如何組織數(shù)據(jù),采用什么存儲(chǔ)結(jié)構(gòu)?,int,studentId30 = 1,2,3,4,5,6;,char

2、,瑳摵湥乴浡孥?孝?筻,令狐沖,林平之,屻,岳靈珊,任瑩瑩,;,char,瑳摵湥卻硥?孝?筻,男,男,女,女,;,int,timeOfEnter30 = 2006,2006,2006,2006;,int,scoreComputer30 = 90,78,89,78;,int,scoreEnglish30 = 83,92,72,95;,int,scoreMath30 = 72,88,98,87;,int,scoreMusic30 = 82,78,66,90;,采用分散的一維數(shù)組結(jié)構(gòu),?,數(shù)據(jù)的內(nèi)存管理方式,90,78,89,78,83,92,72,95,72,88,98,87,82,78,66,9

3、0,1,2,3,4,令狐沖,林平之,岳靈珊,任瑩瑩,男,男,女,女,2006,2006,2006,2006,2000,4000,4E00,F010,10F0,EE00,CE00,6600,存儲(chǔ)學(xué)生信息的設(shè)想,建立一個(gè)長(zhǎng)度為,30,的數(shù)組,其中的每一個(gè)數(shù),組元素就是一個(gè)學(xué)生的學(xué)生考試信息,每一個(gè),數(shù)組元素的理想存儲(chǔ)結(jié)構(gòu)可為:,學(xué)號(hào),姓,名,性別,入學(xué),原理,C,編譯,OS,一個(gè)完整的變量,StudentId,StudentName,StudentSesx,TimeOfEnter,Score_1,Score_2,Score_3,Score_4,8.2,結(jié)構(gòu)體類型與結(jié)構(gòu)體變量,格式,struct,標(biāo)

4、識(shí)符,類型,1,域名,1,;,類型,2,域名,2,;,類型,n,域名,n,;,;,其中:標(biāo)識(shí)符是定義的結(jié)構(gòu)體類型名;,結(jié)構(gòu)體名,成員、域,一、結(jié)構(gòu)體的聲明,舉例,定義學(xué)生檔案的結(jié)構(gòu)體,struct,personnel,int,num,;,char,name10,;,char,sex,;,int,age,;,float,score,;,char,addr30,;,;,變量說(shuō)明,struct personnel,person,;,二、定義結(jié)構(gòu)體的變量,struct,類型,變量名,,,;,1,、先聲明類型后定義變量,struct,personnel,int,num;,char,name10;,cha

5、r,sex;,int,age;,float,score;,char,addr30;,;,struct personnel,stu1, stu2,;,2,、在聲明同時(shí)定義變量,struct,personnel,int,num;,char,name10;,char,sex;,int,age;,float,score;,char,addr30;,student1, student2,;,struct,personnel,int,num;,char,name10;,char,sex;,int,age;,float,score;,char,addr30;,;,struct personnel,stude

6、nt1,student2;,等價(jià),3,、直接定義結(jié)構(gòu)類型變量,struct,int,num;,char name10;,char sex;,int,age;,float score;,char addr30;,student1, student2,;,如:,struct date, int month,;,int day;,int year;,;,struct student, int,num;,char,name10;,struct,date,birthday,;,stu1;,4,、成員也可以是一個(gè)結(jié)構(gòu)體變量,num,name,birthday,month,day,year,5,、定義指向結(jié)

7、構(gòu)體的指針變量,格式,struct,結(jié)構(gòu)類型名,*,指針名;,舉例,struct student,*p, stu1,;,p=,指針,p,即指向結(jié)構(gòu)體變量,stu1,的首地址。,三、結(jié)構(gòu)體變量的引用,格式,結(jié)構(gòu)體變量名,.,域名,舉例,輸出學(xué)生檔案數(shù)據(jù),printf(%d,person,.,num,);,printf(%s,person,.,name,);,printf(%c,person,.,sex,);,printf(%d,person,.,age,);,printf(%f,person,.,score,);,printf(%s,person,.,addr,);,1,、圓點(diǎn)運(yùn)算符,2,、箭頭

8、運(yùn)算符,域表示,結(jié)構(gòu)指針名,域名,舉例,p,num,等價(jià)于,(*p),.,num,struct personnel *p, stu1;,p=,結(jié)構(gòu)體變量引用說(shuō)明,不能將一個(gè)結(jié)構(gòu)體變量作為一個(gè),整體,進(jìn)行輸入和輸出。下面是錯(cuò)誤的:,printf(%d,%s,%c,%d,%f,%sn,student1);,而應(yīng)按成員輸入和輸出。,printf(“%d,n”,student1.num);,printf(“%s,n”,);,如果成員本身又屬一個(gè)結(jié)構(gòu)體類型,,則要用若干個(gè)成員運(yùn)算符,一級(jí)一級(jí)地,找到最低一級(jí)的成員。只能對(duì)最低一級(jí),的成員進(jìn)行賦值、存取和運(yùn)算。,struct da

9、te,struct student,int month; int num;,int day; char name10,int year;,struct date birthday;,; student1,student2;,例如:,student1.num,student1.birthday.month,對(duì)結(jié)構(gòu)體變量的成員可以像普通,變量一樣進(jìn)行各種運(yùn)算。,可以引用結(jié)構(gòu)體變量成員的地址,,也可以引用結(jié)構(gòu)體變量的地址。,例如:,scanf(%x, ,printf(%x, ,思考題,?,struct,point,int,x;,int,y;,;,struct,rect,struct,point pt

10、1;,struct,point pt2;,;,?,struct,rect rt, *rp=,?,下面表達(dá)式哪些合法?,rt.pt1.x,(*rp).pt1.x,rp-pt1.x,rt-pt1.x,?,上面合法的表達(dá)式都是等價(jià)的嗎?,5,、結(jié)構(gòu)體變量的初始化,struct,personnel,long int num;,char,name10;,char,sex;,int,age;,char,addr30;,stu,=,89031, li san , m, 18, 123 beijing road ,;,8.3,結(jié)構(gòu)體數(shù)組,struct personnel,int,num;,char name1

11、0;,char sex;,int,age;,float score;,char addr30;,;,1,、聲明結(jié)構(gòu)體,2,、定義結(jié)構(gòu)體數(shù)組,格式,struct,personnel,int num;,char name10;,char sex;,int age;,float score;,char addr30;,;,struct personnel,stu3;,3,、初始化結(jié)構(gòu)體數(shù)組,struct personnel,stu3,=,10101,Li lin,m,18,87.5,C Beijing road,10102,Zhang li,f,19,99,X Shanghai road,10103

12、,Wang bin,m,20,78.5, zhongshan road,;,num,name,sex,age,score,addr,10101,Li lin,m,18,87.5,103 beijing road,10102,Zhang li,f,19,99,130 shanghai road,10104,Wang bin,m,20,78.5,26 zhongshan road,stu0,stu1,stu2,4,、結(jié)構(gòu)體數(shù)組和指針,struct personnel,stu,30,*p,;,p,=stu;,*p,?,stu0,*(p+1),?,stu1,*(p+2),?,stu2,*(p+3),?

13、,stu3,stu1.,num,?,(*(p+1).,num,?,(p+1),-,num,5,、結(jié)構(gòu)體類型應(yīng)用舉例:,(1),已知:,struct,sk,int a;,float b;,data, *p;,若有,p = ,則正確的引用,data,中成員,a,的方是:,A.,(*p).data.a B. (*p).a,C. p-data.a D. p.data.a,B,(2),讀程序,寫出運(yùn)行結(jié)果。,main(), struct,int x;,int y;,4,*p=s;,printf(“%d,%d,n”,+p,-x,(+p)-x);,4,3,8.4,結(jié)構(gòu)體與函數(shù),把結(jié)構(gòu)體傳遞給函數(shù)的方式有三種

14、:,1.,用結(jié)構(gòu)體的單個(gè)成員作參數(shù),在一般情況下,用單個(gè)成員作為,實(shí)參,給函,數(shù)傳遞參數(shù)與普通的值傳遞沒(méi)有分別,可看成,普通的實(shí)參,是單向值傳遞,在函數(shù)內(nèi)部對(duì)參,數(shù)進(jìn)行操作不影響結(jié)構(gòu)體的變化。,main(), struct number,int num1;,int num2;,num;,num.num1=5;,num.num2=4;,f(num.num1, num.num2);,.,.,.,void f(int m,int n),for(i=1;i=m;i+),for(j=1;j=n;j+),printf(“*”);,2,、用結(jié)構(gòu)體整體作為實(shí)參,要求,實(shí)參和形參的數(shù)據(jù)類型相同,(,單向值傳遞,

15、),舉例,struct date,int year;,int month;,int day;,;,void func(struct date p),p.year = 2000;,p.month = 5;,p.day = 22;,main(),struct date d;,d.year = 1999;,d.month = 4;,d.day = 23;,printf(“%d,%d,%d,n”,d.year, d.month, d.day);,func(d);,printf(“%d,%d,%d,n”,d.year, d.month, d.day);,3,、用指向結(jié)構(gòu)體的指針作為實(shí)參,要求,實(shí)參和形參

16、指向相同的數(shù)據(jù)類型。,舉例,struct date,int year;,int month;,int day;,;,void func(struct date *p),(*p).year = 2000;,(*p).month = 5;,(*p).day = 22;,main(),struct date date1,*d=,d-year = 1999;,d-month = 4;,d-day = 23;,printf(%d,%d,%dn,(*d).year, (*d).month, (*d).day);,func(d);,printf(%d,%d,%dn,d-year, d-month, d-da

17、y);,4,、,Typedef,的使用,給已定義的數(shù)據(jù)類型定義別名。,功,能,舉,例,typedef,int integer,;,typedef,struct student,stu,;,說(shuō)明,struct student,stu1, stu2;,等價(jià)于,stu,stu1,stu2;,使用別名時(shí),可不使用,struct,。,8.5,共用體,聯(lián)合體,什么是共用體?,是,C,語(yǔ)言提供的一種存儲(chǔ)共享的設(shè)施。,即將若干個(gè)名稱不同、類型不同的數(shù)據(jù),共,享同一存儲(chǔ)單元,。也就是使用覆蓋技術(shù),,幾個(gè)長(zhǎng)度不同的變量相互覆蓋。,一、共用體類型的定義,格式,union,共用體名,類型,1,成員,1,;,類型,2,

18、成員,2,;,類型,n,成員,n,;,變量序列,;,舉例,union,data,int,i,;,char,ch,;,float,f,; ;,變量序列是,可選項(xiàng)。,union,data,int,i,;,char,ch,;,float,f,; ,a,;,說(shuō)明,共用體所占存儲(chǔ)單元長(zhǎng)度是成員的最大者。,二、共用體與結(jié)構(gòu)體的區(qū)別,結(jié)構(gòu)體的每一個(gè)成員都占用自己的,存儲(chǔ)空間。,共用體的每個(gè)成員共享同一個(gè)存儲(chǔ),單元。,結(jié)構(gòu)體所占存儲(chǔ)空間的大小是所有,成員所占空間大小的總和。,共用體所占存儲(chǔ)單元的大小是所有,成員中占用空間最大的。,三、共用體類型數(shù)據(jù)的訪問(wèn),格式,變量名,.,成員名,舉例,a.i,引用共用體變量,a,中的整形變量,i,a.ch,引用共用體變量,a,中的字符變量,ch,a.f,引用共用體變量,a,中的實(shí)型變量,f,說(shuō)明,不能只引用共用體變量,例如:,printf(%d, a);,而應(yīng)是:,printf(%d, a.i); ,printf(%c, a.ch); ,printf(%f, a.f); ,四、共用體類型數(shù)據(jù)的特點(diǎn),1.,不能把共用體變量作為

溫馨提示

  • 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)論