




版權(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年初中人教初中生物八年級(jí)上冊(cè)第五單元第三章 動(dòng)物在生物圈中的作用說(shuō)課稿
- 2024年西安中遠(yuǎn)水工程質(zhì)量檢測(cè)有限公司招聘(6人)筆試參考題庫(kù)附帶答案詳解
- 班級(jí)管理中小學(xué)生自我意識(shí)的培養(yǎng)策略研究
- 2024河北衡水中建邯港高速公路管理有限公司招聘高速公路收費(fèi)員60人筆試參考題庫(kù)附帶答案詳解
- 2.2加強(qiáng)憲法監(jiān)督(課時(shí)檢測(cè))-八年級(jí)《道德與法治》下冊(cè)(統(tǒng)編版)
- 2024廣東佛山市高明展達(dá)資產(chǎn)投資有限公司副職招聘1人筆試參考題庫(kù)附帶答案詳解
- 第六單元課外古詩(shī)詞誦讀《秋詞(其一)》教學(xué)設(shè)計(jì) 2024-2025學(xué)年統(tǒng)編版語(yǔ)文七年級(jí)上冊(cè)
- 2024年四川瀘州市興瀘商貿(mào)有限公司社會(huì)公開(kāi)招聘1人筆試參考題庫(kù)附帶答案詳解
- 第2章 第3節(jié) 多細(xì)胞生物體(新教學(xué)設(shè)計(jì))2023-2024學(xué)年七年級(jí)上冊(cè)生物(冀少版)
- 第十章 極地地區(qū) 教學(xué)設(shè)計(jì)-2023-2024學(xué)年七年級(jí)地理下學(xué)期人教版
- 化工公司原址污染場(chǎng)地污染土壤治理修復(fù)方案
- 法蘭標(biāo)準(zhǔn)尺寸表(美標(biāo)、日標(biāo)、德標(biāo))
- 施工技術(shù)管理項(xiàng)總體思路、方式和方法解析
- 城市規(guī)劃與建筑學(xué)專(zhuān)業(yè)英語(yǔ)
- 《兒童心理健康課件》
- 《旅游市場(chǎng)營(yíng)銷(xiāo)》課程教案(東北財(cái)經(jīng)大學(xué)出版社)
- 老年人能力評(píng)估基本知識(shí)
- CATL設(shè)備電氣控制標(biāo)準(zhǔn)-V10
- 糖尿病高滲性昏迷HNDC搶救流程圖
- 風(fēng)電場(chǎng)設(shè)備材料設(shè)備清單
- 裝載機(jī)駕駛員理論考試復(fù)習(xí)題庫(kù)(500題)
評(píng)論
0/150
提交評(píng)論