《c語(yǔ)言程序設(shè)計(jì)》課件-第8章 結(jié)構(gòu)體與共用體_第1頁(yè)
《c語(yǔ)言程序設(shè)計(jì)》課件-第8章 結(jié)構(gòu)體與共用體_第2頁(yè)
《c語(yǔ)言程序設(shè)計(jì)》課件-第8章 結(jié)構(gòu)體與共用體_第3頁(yè)
《c語(yǔ)言程序設(shè)計(jì)》課件-第8章 結(jié)構(gòu)體與共用體_第4頁(yè)
《c語(yǔ)言程序設(shè)計(jì)》課件-第8章 結(jié)構(gòu)體與共用體_第5頁(yè)
已閱讀5頁(yè),還剩34頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

第8章結(jié)構(gòu)體與共用體C語(yǔ)言程序設(shè)計(jì)本章內(nèi)容結(jié)構(gòu)體(結(jié)構(gòu)structure)類(lèi)型共用體(聯(lián)合union)類(lèi)型結(jié)構(gòu)體變量、結(jié)構(gòu)體數(shù)組、結(jié)構(gòu)體指針向函數(shù)傳遞結(jié)構(gòu)體用結(jié)構(gòu)體指針實(shí)現(xiàn)動(dòng)態(tài)數(shù)據(jù)結(jié)構(gòu)鏈表的概念及操作原理思考一個(gè)問(wèn)題在程序里表示一個(gè)人(姓名、年齡、性別…),怎么表示?想表示多個(gè)人呢?如何用計(jì)算機(jī)程序?qū)崿F(xiàn)下述表格的管理?表8-1某學(xué)校學(xué)生成績(jī)管理表學(xué)號(hào)姓名性別入學(xué)時(shí)間計(jì)算機(jī)原理英語(yǔ)數(shù)學(xué)音樂(lè)1令狐沖男1999908372822林平之男1999789288783岳靈珊女1999897298664任盈盈女1999789587905……6……數(shù)組的解決方法int studentId[30];/*最多可以管理30個(gè)學(xué)生,每個(gè)學(xué)生的學(xué)號(hào)用數(shù)組的下標(biāo)表示*/char studentName[30][10]; char studentSex[30][2];

int timeOfEnter[30];/*入學(xué)時(shí)間用int表示*/int scoreComputer[30];/*計(jì)算機(jī)原理課的成績(jī)*/int scoreEnglish[30];/*英語(yǔ)課的成績(jī)*/ int scoreMath[30]; /*數(shù)學(xué)課的成績(jī)*/int scoreMusic[30]; /*音樂(lè)課的成績(jī)*/intstudentId[30]={1,2,3,4,5,6};char studentName[30][10]={{"令狐沖"},{"林平之"},{"岳靈珊"},{"任盈盈"}};char studentSex[30][2]={{"男"},{"男"},{"女"},{"女"}};int timeOfEnter[30]={1999,1999,1999,1999};int scoreComputer[30]={90,78,89,78};int scoreEnglish[30]={83,92,72,95};int scoreMath[30]={72,88,98,87};int scoreMusic[30]={82,78,66,90};

數(shù)組的解決方法數(shù)據(jù)的內(nèi)存管理方式90788978……83927295……72889887……82786690……1234……令狐沖林平之岳靈珊任盈盈……男男女女……1999199919991999……數(shù)組的解決方法數(shù)據(jù)的內(nèi)存管理方式90788978……83927295……72889887……82786690……1234……令狐沖林平之岳靈珊任盈盈……男男女女……1999199919991999……數(shù)組的解決方法分配內(nèi)存不集中,尋址效率不高對(duì)數(shù)組進(jìn)行賦初值時(shí),容易發(fā)生錯(cuò)位結(jié)構(gòu)顯得比較零散,不容易管理希望的內(nèi)存分配圖

1令狐沖男1999908372822林平之男1999789288783岳靈珊女1999897298664任盈盈女199978958790結(jié)構(gòu)體的解決方法structSTUDENT

{

intstudentID;/*每個(gè)學(xué)生的序號(hào)*/

charstudentName[10];/*每個(gè)學(xué)生的姓名*/ charstudentSex[4];/*每個(gè)學(xué)生的性別*/ int timeOfEnter;/*每個(gè)學(xué)生的入學(xué)時(shí)間*/ int scoreComputer;/*每個(gè)學(xué)生的計(jì)算機(jī)原理成績(jī)*/ int scoreEnglish;/*每個(gè)學(xué)生的英語(yǔ)成績(jī)*/ int scoreMath; /*每個(gè)學(xué)生的數(shù)學(xué)成績(jī)*/ int scoreMusic;/*每個(gè)學(xué)生的音樂(lè)成績(jī)*/

};struct

STUDENT是一個(gè)類(lèi)型struct

STUDENT

students[4];students[0].studentID

students[0].scoreComputer它們都是變量,一般稱(chēng)為結(jié)構(gòu)的成員變量用戶(hù)自定義的數(shù)據(jù)類(lèi)型結(jié)構(gòu)體:把關(guān)系緊密、且邏輯相關(guān)的多種不同類(lèi)型的變量,組織到統(tǒng)一的名字之下占用相鄰的一段內(nèi)存單元共用體:把情形互斥、但邏輯相關(guān)的多種不同類(lèi)型的變量,組織到統(tǒng)一的名字之下占用同一段內(nèi)存單元,每一時(shí)刻只有一個(gè)數(shù)據(jù)起作用10010LiFunM1887.5Beijingnumnamesexagescoreaddr形成一個(gè)樣板用于生成結(jié)構(gòu)體變量struct

結(jié)構(gòu)體名{

類(lèi)型關(guān)鍵字

成員名1;

類(lèi)型關(guān)鍵字成員名2;…...

類(lèi)型關(guān)鍵字成員名n;};構(gòu)成結(jié)構(gòu)體的變量稱(chēng)結(jié)構(gòu)體成員(member)也稱(chēng)域(filed)結(jié)構(gòu)體類(lèi)型的定義Don’tforgetthesemicolon!!structstudent{

intnum;

charname[20];

charsex;

intage;

floatscore;

charaddr[30];};10010LiFunM1887.5Beijingnumnamesexagescoreaddrstructstudent{

intnum;

charname[20];

charsex;

intage;

floatscore;

charaddr[30];};struct

結(jié)構(gòu)體名{

類(lèi)型關(guān)鍵字

成員名1;

類(lèi)型關(guān)鍵字成員名2;…...

類(lèi)型關(guān)鍵字成員名n;};結(jié)構(gòu)體類(lèi)型的定義只定義了數(shù)據(jù)的形式,即聲明了一種復(fù)雜的數(shù)據(jù)類(lèi)型,并未生成任何變量。先定義結(jié)構(gòu)體類(lèi)型再定義變量名在定義類(lèi)型的同時(shí)定義變量直接定義結(jié)構(gòu)體變量(不出現(xiàn)結(jié)構(gòu)體名)structstudent

student1,student2;structstudent{

intnum;

charname[20];

charsex;

intage;

floatscore;

charaddr[30];}student1,student2;struct

{

intnum;

charname[20];

charsex;

intage;

floatscore;

charaddr[30];}student1,student2;結(jié)構(gòu)體變量的定義定義自己的類(lèi)型名struct

student

student1,student2;/*Itworks*/student

student1,student2;/*Canthiswork?*/

typedef

struct

student

STUD;STUD

student1,student2;

/*Itworks!*/typedef為一種已存在的類(lèi)型定義一個(gè)新名字STUD與struct

student類(lèi)型是同義詞structstudent{

intnum;

charname[20];

charsex;

intage;

floatscore;

charaddr[30];};struct類(lèi)型的特點(diǎn)是一個(gè)普通的類(lèi)型可以定義該類(lèi)型的變量、數(shù)組、指針……可以做函數(shù)的參數(shù)類(lèi)型和返回值類(lèi)型它的成員可以是任意類(lèi)型基本類(lèi)型、數(shù)組、指針、結(jié)構(gòu)體、共用體……struct類(lèi)型的變量?jī)蓚€(gè)結(jié)構(gòu)體變量之間可以相互賦值所以做為函數(shù)的參數(shù)時(shí),是傳值調(diào)用可以取地址&不可直接參與算術(shù)和比較運(yùn)算面向?qū)ο蠛蛿?shù)據(jù)庫(kù)是struct思想的發(fā)展結(jié)構(gòu)體的內(nèi)存占用double占用內(nèi)存字節(jié)數(shù)=8struct類(lèi)型用內(nèi)存字節(jié)數(shù)=?是所有成員變量的內(nèi)存總和嗎?structnumber{

shorti;

charch;

floatf;};printf("%d\n",sizeof(structnumber));用運(yùn)算符sizeof獲得結(jié)構(gòu)體大小sizeof(變量或表達(dá)式)sizeof(類(lèi)型)8Why?結(jié)構(gòu)體的內(nèi)存占用事實(shí)上所有數(shù)據(jù)類(lèi)型在內(nèi)存中都是從偶數(shù)地址開(kāi)始存放的且結(jié)構(gòu)所占的實(shí)際空間一般是按照機(jī)器字長(zhǎng)對(duì)齊的不同的編譯器、平臺(tái),對(duì)齊方式會(huì)有變化結(jié)構(gòu)體變量的成員的存儲(chǔ)對(duì)齊規(guī)則是與機(jī)器相關(guān)的具有特定數(shù)據(jù)類(lèi)型的數(shù)據(jù)項(xiàng)的大小也是與機(jī)器相關(guān)的所以一個(gè)結(jié)構(gòu)體在內(nèi)存中的存儲(chǔ)格式也是與機(jī)器相關(guān)的ifchichf非所有成員變量的內(nèi)存總和8個(gè)字節(jié)structSTUDENT{

int studentID;

char studentName[10];

char studentSex[4];

structdatetimeOfEnter;

int scoreComputer;

int scoreEnglish;

int scoreMath;

int scoreMusic;};

structSTUDENTstu[30];

結(jié)構(gòu)體數(shù)組學(xué)號(hào)姓名性別入學(xué)時(shí)間計(jì)算機(jī)原理年月日英語(yǔ)數(shù)學(xué)音樂(lè)structdate{

intyear;

intmonth;

intday;};

結(jié)構(gòu)體定義可以嵌套structSTUDENTstu[30]={{1,"令狐沖","男",{1999,08,26},90,83,72,82},{2,"林平之","男",{1999,08,26},78,92,88,78},{3,"岳靈珊","女",{1999,08,26},89,72,98,66},{4,"任盈盈","女",{1999,08,26},78,95,87,90}};初始化結(jié)構(gòu)體數(shù)組structSTUDENT{

int studentID;

char studentName[10];

char studentSex[4];

structdatetimeOfEnter;

int scoreComputer;

int scoreEnglish;

int scoreMath;

int scoreMusic;};

structSTUDENTstu[30]={{1,"令狐沖","男",{1999,08,26},90,83,72,82},{2,"林平之","男",{1999,08,26},78,92,88,78},{3,"岳靈珊","女",{1999,08,26},89,72,98,66},{4,"任盈盈","女",{1999,08,26},78,95,87,90}};初始化1令狐沖男9019998268072822林平之男7819998269288783岳靈珊女8919998267298664任盈盈女781999826958790建立了數(shù)據(jù)庫(kù)中的多條記錄,每條對(duì)應(yīng)一個(gè)學(xué)生信息結(jié)構(gòu)體變量的指針pStustustructSTUDENT{

int studentID;

char studentName[10];

char studentSex[4];

structdatetimeOfEnter;

int scoreComputer;

int scoreEnglish;

int scoreMath;

int scoreMusic;};

struct

STUDENT

stu;/*定義結(jié)構(gòu)體變量*/struct

STUDENT

*pStu;/*定義結(jié)構(gòu)體指針*/

pStu=&stu;成員1成員2成員3成員4成員5成員6成員7成員8pStustustructSTUDENT{

int studentID;

char studentName[10];

char studentSex[4];

structdatetimeOfEnter;

int scoreComputer;

int scoreEnglish;

int scoreMath;

int scoreMusic;};

struct

STUDENT

stu;/*定義結(jié)構(gòu)體變量*/struct

STUDENT

*pStu;/*定義結(jié)構(gòu)體指針*/

pStu=&stu;成員1成員2成員3成員4成員5成員6成員7成員8如何訪(fǎng)問(wèn)結(jié)構(gòu)體的成員通過(guò)stu和成員運(yùn)算符訪(fǎng)問(wèn)結(jié)構(gòu)體成員stu.studentID=1;通過(guò)pStu和指向運(yùn)算符訪(fǎng)問(wèn)結(jié)構(gòu)體成員(*pStu).studentID=1;pStu->studentID=1;structSTUDENT{

int studentID;

char studentName[10];

char studentSex[4];

structdatetimeOfEnter;

int scoreComputer;

int scoreEnglish;

int scoreMath;

int scoreMusic;};

struct

STUDENT

stu;/*定義結(jié)構(gòu)體變量*/struct

STUDENT

*pStu;/*定義結(jié)構(gòu)體指針*/

pStu=&stu;如何訪(fǎng)問(wèn)嵌套的結(jié)構(gòu)體的成員stu.

timeOfEnter.

year=1999;(*pStu).

timeOfEnter.

year=1999;pStu->

timeOfEnter.

year=1999;structdate{

intyear;

intmonth;

intday;};

思考題structpoint

{

intx;

inty;

};

structrect

{

structpointpt1;

structpointpt2;

};structrectrt;structrect*rp=&rt;下面表達(dá)式哪些合法?rt.pt1.xrp.pt1.x(*rp).pt1.x(&rt)->pt1.xrp->pt1.xrt->pt1.x上面合法的表達(dá)式都是等價(jià)的嗎?structSTUDENTstu[4]={{1,"令狐沖","男",{1999,08,26},90,83,72,82},{2,"林平之","男",{1999,08,26},78,92,88,78},{3,"岳靈珊","女",{1999,08,26},89,72,98,66},{4,"任盈盈","女",{1999,08,26},78,95,87,90}};結(jié)構(gòu)體數(shù)組的指針pStustu[4]structSTUDENT{

int studentID;

char studentName[10];

char studentSex[4];

structdatetimeOfEnter;

int scoreComputer;

int scoreEnglish;

int scoreMath;

int scoreMusic;};

structSTUDENT*pStu;/*定義結(jié)構(gòu)體指針*/pStu=stu;/*相當(dāng)于pStu=&stu[0];*/stu[0]stu[1]stu[2]stu[3]使用pStu++,使pStu指向stu[i]pStu->studentID等價(jià)于

stu[i].studentID如何訪(fǎng)問(wèn)結(jié)構(gòu)體數(shù)組元素的成員pStustu[4]structSTUDENT{

int studentID;

char studentName[10];

char studentSex[4];

structdatetimeOfEnter;

int scoreComputer;

int scoreEnglish;

int scoreMath;

int scoreMusic;};

structSTUDENT*pStu;/*定義結(jié)構(gòu)體指針*/pStu=stu;/*相當(dāng)于pStu=&stu[0];*/stu[0]stu[1]stu[2]stu[3]向函數(shù)傳遞結(jié)構(gòu)體向函數(shù)傳遞結(jié)構(gòu)體的單個(gè)成員復(fù)制單個(gè)成員的內(nèi)容函數(shù)內(nèi)對(duì)結(jié)構(gòu)內(nèi)容的修改不影響原結(jié)構(gòu)向函數(shù)傳遞結(jié)構(gòu)體的完整結(jié)構(gòu)?向函數(shù)傳遞結(jié)構(gòu)體的首地址?structdate{

intyear;

intmonth;

intday;};voidfunc(structdate

p){

p.year=2000;

p.month=5;

p.day=22;}main(){

structdated;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);}1999,4,231999,4,23結(jié)構(gòu)體變量

做函數(shù)參數(shù)structdate{

intyear;

intmonth;

intday;};voidfunc(structdate

*p){

p->year=2000;

p->month=5;

p->day=22;}main(){

structdated;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);}1999,4,232000,5,22結(jié)構(gòu)體指針

做函數(shù)參數(shù)指針做函數(shù)形參實(shí)參必須為地址值structdate{

intyear;

intmonth;

intday;};structdatefunc(structdate

p){

p.year=2000;

p.month=5;

p.day=22;}main(){

structdated;d.year=1999;d.month=4;d.day=23;printf(“%d,%d,%d\n”,d.year,d.month,d.day);

d=func(d);

printf(“%d,%d,%d\n”,d.year,d.month,d.day);}結(jié)構(gòu)體變量

做函數(shù)返回值存在一個(gè)錯(cuò)誤structdate{

intyear;

intmonth;

intday;};structdatefunc(structdate

p){

p.year=2000;

p.month=5;

p.day=22;

returnp;}main(){

structdated;d.year=1999;d.month=4;d.day=23;printf(“%d,%d,%d\n”,d.year,d.month,d.day);

d=func(d);

printf(“%d,%d,%d\n”,d.year,d.month,d.day);}1999,4,232000,5,22結(jié)構(gòu)體變量

做函數(shù)返回值向函數(shù)傳遞結(jié)構(gòu)體向函數(shù)傳遞結(jié)構(gòu)體的完整結(jié)構(gòu)復(fù)制整個(gè)結(jié)構(gòu)體成員的內(nèi)容,多個(gè)值函數(shù)內(nèi)對(duì)結(jié)構(gòu)內(nèi)容的修改不影響原結(jié)構(gòu)內(nèi)容傳遞更直觀,但開(kāi)銷(xiāo)大向函數(shù)傳遞結(jié)構(gòu)體的首地址用結(jié)構(gòu)體數(shù)組/結(jié)構(gòu)體指針做函數(shù)參數(shù)僅復(fù)制結(jié)構(gòu)體的首地址,一個(gè)值修改結(jié)構(gòu)體指針?biāo)赶虻慕Y(jié)構(gòu)體的內(nèi)容指針傳遞效率高思考下面的結(jié)構(gòu)是什么意思?structtemp

{

int data;

structtemppt;

};CB下的錯(cuò)誤提示:field'pt'hasincompletetypeTC下的錯(cuò)誤提示:Undefinedstructure‘temp’StructuresizetoolargeVC下的錯(cuò)誤提示:'pt'usesundefinedstruct‘temp’下面的結(jié)構(gòu)是什么意思呢?structtemp

{

intdata;

structtemp*pt;

};結(jié)構(gòu)體聲明時(shí)不能包含本結(jié)構(gòu)體類(lèi)型成員系統(tǒng)將無(wú)法為這樣的結(jié)構(gòu)體類(lèi)型分配內(nèi)存

可包含指向本結(jié)構(gòu)體類(lèi)型的指針變量共用體,或稱(chēng)為聯(lián)合(Union)structnumber{

shorti;

charch;

floatf;};0x0037b00unionnumber{

shorti;

charch;

floatf;};printf("%d\n",sizeof(structnumber));ichf8個(gè)字節(jié)ichf4個(gè)字節(jié)printf("%d\n",sizeof(unionnumber));共用體,或稱(chēng)為聯(lián)合(Union)sizeof(unionnumber)取決于占空間最多的那個(gè)成員變量0x0037b00同一內(nèi)存單元在每一瞬時(shí)只能存放其中一種類(lèi)型的成員;起作用的成員是最后一次存放的成員不能作為函數(shù)參數(shù)不能進(jìn)行比較操作,只能對(duì)第一個(gè)成員初始化f4個(gè)字節(jié)structperson{

charname[20];

charsex;

intage;

uni

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
  • 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ì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論