《C語(yǔ)言程序設(shè)計(jì)教程(第4版)》第10章結(jié)構(gòu)體與共用體_第1頁(yè)
《C語(yǔ)言程序設(shè)計(jì)教程(第4版)》第10章結(jié)構(gòu)體與共用體_第2頁(yè)
《C語(yǔ)言程序設(shè)計(jì)教程(第4版)》第10章結(jié)構(gòu)體與共用體_第3頁(yè)
《C語(yǔ)言程序設(shè)計(jì)教程(第4版)》第10章結(jié)構(gòu)體與共用體_第4頁(yè)
《C語(yǔ)言程序設(shè)計(jì)教程(第4版)》第10章結(jié)構(gòu)體與共用體_第5頁(yè)
已閱讀5頁(yè),還剩23頁(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)介

第10章結(jié)構(gòu)體與共用體自定義類(lèi)型標(biāo)識(shí)符結(jié)構(gòu)體的定義與引用共用體的定義與引用10.1自定義類(lèi)型標(biāo)識(shí)符一般格式:typedef原類(lèi)型名新類(lèi)型名例如: typedefintINTEGER;typedeffloatREAL;所以有:inti;floatx;INTEGERi;REALx;等價(jià)于

typedefintARRAY[100];ARRAYa,b,c;又如:inta[100],b[100],c[100];等價(jià)1、先按定義變量的方法寫(xiě)出定義語(yǔ)句;

如:inta[10];2、將變量名用新類(lèi)型名替換; 如:intARRAY[10];3、在最前面加typedef;

如:typedefintARRAY[10];4、然后可以用新類(lèi)型名定義變量。 如:ARRAYa,b,c;定義一個(gè)新類(lèi)型的步驟1)用typedef可以定義各種類(lèi)型名,但不能用來(lái)定義變量。2)用typedef只能為已經(jīng)存在的數(shù)據(jù)類(lèi)型標(biāo)識(shí)符另起一個(gè)新名,而不能創(chuàng)造一種新類(lèi)型。3)要注意typedef與#define的區(qū)別,如:

typedefintSUM;

#defineSUMint注意:

數(shù)組可以表示一組類(lèi)型相同的數(shù)據(jù)。在實(shí)際中,通常需要通過(guò)一組不同類(lèi)型的數(shù)據(jù)共同來(lái)描述某個(gè)實(shí)體。如:學(xué)生個(gè)人資料(學(xué)號(hào)、姓名、性別、年齡和學(xué)習(xí)成績(jī))。

C語(yǔ)言提供的結(jié)構(gòu)體就是這樣一種數(shù)據(jù)類(lèi)型,它由一組稱(chēng)為成員(域或元素)的數(shù)據(jù)成分組成,其中每個(gè)成員可以具有不同的類(lèi)型,用來(lái)存放類(lèi)型不同但又相互有關(guān)的數(shù)據(jù)。

結(jié)構(gòu)體類(lèi)型:是一種C語(yǔ)言沒(méi)有定義、用戶(hù)可以根據(jù)實(shí)際需要自己定義的構(gòu)造型數(shù)據(jù)類(lèi)型。10.2結(jié)構(gòu)體的定義與引用struct結(jié)構(gòu)體類(lèi)型標(biāo)識(shí)符{

類(lèi)型名1結(jié)構(gòu)成員名表1;類(lèi)型名2結(jié)構(gòu)成員名表2;

……

類(lèi)型名n結(jié)構(gòu)成員名表n;};如:描述學(xué)生基本信息

structstudent{intnum;

charname[20];

charsex;

intage;

floatscore;

};結(jié)構(gòu)體數(shù)據(jù)類(lèi)型說(shuō)明的一般格式inta[3];numnamesexagescore成員的組織結(jié)構(gòu)

是變量,會(huì)分配相應(yīng)的空間是類(lèi)型名10.2.2結(jié)構(gòu)體類(lèi)型變量、數(shù)組和指針變量的定義方法1:先定義結(jié)構(gòu)體類(lèi)型,再定義結(jié)構(gòu)體變量如:structstudent{intnum;

charnume[20];

charsex;

intage;

floatscore;

};

structstudentstd,*pstd,pers[3];方法2:在定義結(jié)構(gòu)體類(lèi)型的同時(shí)定義結(jié)構(gòu)體變量如:

structstudent{intnum;

charname[20];

charsex;

intage;

floatscore;}std,*pstd,pers[3];numnamesagescorestdpers10.2.2結(jié)構(gòu)體類(lèi)型變量、數(shù)組和指針變量的定義方法4:使用typedef說(shuō)明一個(gè)結(jié)構(gòu)體類(lèi)型名,然后用新類(lèi)型名定義變量方法3:直接定義結(jié)構(gòu)體變量如:struct{intnum;

charnume[20];

charsex;

intage;

floatscore;

}std,*pstd,pers[3];如:typedefstructstudent{intnum;

charname[20];

charsex;

intage;

floatscore;

}STREC;STREC

std,*pstd,pers[3];10.2.2結(jié)構(gòu)體類(lèi)型變量、數(shù)組和指針變量的定義typedefstructstudent{intnum;

charname[20];

charsex;

intage;

floatscore;

}STREC;STRECstd,*pstd,pers[3];結(jié)構(gòu)體變量的存儲(chǔ)情況:在內(nèi)存中,結(jié)構(gòu)體變量std占據(jù)一片連續(xù)的存儲(chǔ)空間,該空間的首地址為&std

結(jié)構(gòu)體數(shù)組pers在內(nèi)存中占一片連續(xù)空間,該空間被等分成3分,每一份用于保存一個(gè)結(jié)構(gòu)體數(shù)組元素結(jié)構(gòu)體指針變量pstd在內(nèi)存中占一個(gè)存儲(chǔ)單元,它將保存某個(gè)STREC類(lèi)型變量的地址。如pstd=&std;結(jié)構(gòu)體類(lèi)型和結(jié)構(gòu)體變量結(jié)構(gòu)體類(lèi)型說(shuō)明可以嵌套。

structdate{intmonth,day,year;};structstudent{intnum;

charnume[20];

charsex;

intage;

structdatebirthday;

floatscore;

};structstudent{intnum;

charname[10];

charsex;

intage;

structdate {intyear; intmonth; intday; }birthday;

floatscore;

};10.2.2結(jié)構(gòu)體類(lèi)型變量、數(shù)組和指針變量的定義10.2.3給結(jié)構(gòu)體變量、數(shù)組和指針變量的初始化1、結(jié)構(gòu)體變量的初始化例如:structstudentstd={20001,"LiLi",’M’,19,85};結(jié)構(gòu)體變量名={初值};初值的個(gè)數(shù)、順序、類(lèi)型應(yīng)與成員說(shuō)明一致2、結(jié)構(gòu)體類(lèi)型數(shù)組的初始化struct結(jié)構(gòu)體類(lèi)型標(biāo)識(shí)符結(jié)構(gòu)體數(shù)組名={初值};例如:structstudentpers[2]={{20001,"LiLi",’M’,19,85}{20002,"Wuan",’F’,19,78}};3、結(jié)構(gòu)體指針的初始化struct結(jié)構(gòu)體類(lèi)型標(biāo)識(shí)符*指針變量名=&結(jié)構(gòu)體變量名;

例如:structstudentstd,*sp=&std;10.2.3給結(jié)構(gòu)體變量、數(shù)組和指針變量的初始化10.2.4結(jié)構(gòu)體類(lèi)型變量、數(shù)組和指針變量的引用1、對(duì)結(jié)構(gòu)體成員的引用結(jié)構(gòu)體變量名.成員名

(*指針變量名).成員名指針變量名->成員名std.num=10101;等價(jià)于sp->num=10101;std.sex=’M’;等價(jià)于(*sp).sex=’M’;std.score=75+8;等價(jià)于(*sp).score=75+8;std.age++;等價(jià)于sp->age++;如:structstudent{longnum;

charname[20];

charsex;

intage;

floatscore;}std,pers[5],*sp=&std;(1)結(jié)構(gòu)體類(lèi)型數(shù)組和結(jié)構(gòu)體成員數(shù)組:數(shù)組元素下標(biāo)的引用原則結(jié)構(gòu)體類(lèi)型成員的引用原則引用結(jié)構(gòu)體成員時(shí)要注意以下幾點(diǎn):structstudent{longnum;

charname[20];

charsex;

intage;

floatscore;}std,pers[5],*sp=&std;[2]或sp->name[2]或(*sp).name[2]。不能寫(xiě)作,因?yàn)閚ame是數(shù)組名。pers[0].age或(pers+0)->age或(*(pers+0)).age。注意:不能寫(xiě)成pers.age。numnamesagescoreperspers[0](2)對(duì)于結(jié)構(gòu)體嵌套的情況,只能引用最低層的成員。std.birthday.month或sp->birthday.month或(*sp).birthday.month。structdate{intmonth,day,year;};structstudent{intnum;

charnume[20];

charsex;

intage;

structdatebirthday;

floatscore;

}std,*sp=&std;引用結(jié)構(gòu)體成員時(shí)要注意以下幾點(diǎn):取結(jié)構(gòu)體變量的地址為:

&結(jié)構(gòu)體變量名如:&std取結(jié)構(gòu)體成員的地址為:

&結(jié)構(gòu)體變量名.成員名如:&std.agestructstudent{longnum;

charname[20];

charsex;

intage;

floatscore;}std,pers[5],*sp=&std;(3)可以用“&”對(duì)結(jié)構(gòu)體類(lèi)型變量、數(shù)組元素及其成員進(jìn)行取地址運(yùn)算了。引用結(jié)構(gòu)體成員時(shí)要注意以下幾點(diǎn):(4)請(qǐng)分析并理解以下幾種運(yùn)算structstudent{longnum;

charname[20];

charsex;

intage;

floatscore;}std,pers[5],*sp=&std;例如有賦值語(yǔ)句:sp=pers;++sp->num與++(sp->num)等價(jià)sp->num++與(sp->num)++等價(jià)(++sp)->num(sp++)->num(5)采用(*sp).num方式引用成員num時(shí),(*sp)兩側(cè)的括號(hào)不能省略。引用結(jié)構(gòu)體成員時(shí)要注意以下幾點(diǎn):(6)根據(jù)定義,指針變量sp只能指向一個(gè)結(jié)構(gòu)體類(lèi)型數(shù)據(jù),而不能指向結(jié)構(gòu)體類(lèi)型數(shù)據(jù)中的某一成員例如,下面是不對(duì)的:sp=&pers[2].num引用結(jié)構(gòu)體成員時(shí)要注意以下幾點(diǎn):10.2.4結(jié)構(gòu)體類(lèi)型變量、數(shù)組和指針變量的引用structstudent{longnum;

charname[20];

charsex;

intage;

floatscore;}std,pers[5],*sp=&std;【例10.1】結(jié)構(gòu)體類(lèi)型變量的引用示例。#include"stdio.h"main(){structstudent{1ongnum;

charname[20];

charsex;

floatscore;

}s1={20001,"LiLi",’M’,85};

structstudents2;

floatsum,ave;

scanf("%ld%s%c%f",&s2.num,,&s2.sex,&s2.score);

sum=s1.score+s2.score;

ave=sum/2;

printf("%ld%s%c%5.1f\n",s1.num,,s1.sex,s1.score);

printf("%ld%s%c%5.1f\n",s2.num,,s2.sex,s2.score);

printf("sum=%5.1fave=%5.1f\n",sum,ave);}【例10.3】指向結(jié)構(gòu)體變量的指針變量的應(yīng)用。main(){structstudent{1ongnum;

charname[20];

floatscore;

};

structstudentstu1,*sp;

sp=&stu1;

stu1.num=20001;

strcpy(,"LiLi");

stu1.score=85;

printf("%ld%ld%ld\n",stu1.num,(*sp).num,sp->num);

printf("%s%s%s\n",stu1.name,(*sp).name,sp->name);

printf("%5.2f%5.2f%5.2f",stu1.score,(*sp).score,sp->score);}【例10.4】結(jié)構(gòu)體類(lèi)型數(shù)組指針變量的引用示例。structstudent{longnum;

charname[20];

floatscore;

};structstudentstu[3]={{20001,“LiLi”,85},

{20002,“Wuan”,78},

{20003,“MaLin”,69}};main(){structstudent*p;

printf("No\tName\tscore\n");

for(p=stu;p<stu+3;p++)

printf("%ld\t%s\t%f\n",p->num,p->name,p->score);}2.對(duì)結(jié)構(gòu)體類(lèi)型變量的整體賦值允許兩個(gè)具有同一種類(lèi)型的結(jié)構(gòu)體變量之間進(jìn)行整體賦值操作。例如有以下定義:structstudent{1ongnum;

charname[20]:

charsex;

intage;

floatscore;}std1,std2={11011,“YangLin”,’M’,18,89};則在程序中,可以用賦值語(yǔ)句:std1=std2;這樣實(shí)際上是將std2中各個(gè)成員的值分別賦給了std1中對(duì)應(yīng)的同名成員。10.2.5函數(shù)之間結(jié)構(gòu)體變量的數(shù)據(jù)傳遞在函數(shù)之間傳遞結(jié)構(gòu)體類(lèi)型數(shù)據(jù)有三種方法用結(jié)構(gòu)體變量的成員作參數(shù)

c語(yǔ)言允許將結(jié)構(gòu)體變量的成員象普通變量一樣傳遞給一個(gè)函數(shù).10.5統(tǒng)計(jì)一個(gè)班及格學(xué)生的人數(shù)main(){intcount();intj,ok=0;

structstudent{intnum;charname[20];intscore;}stu[3];for(j=0;j<3;j++)scanf("%d%s%d",&stu[j].num,stu[j].name,&stu[j].score);for(j=0;j<3;j++)ok+=count(stu[j].score);printf("Theresultis:%d\n",ok);}intcount(intx){intm=0;if(x>=60)m=1;return(m);}0aaa231sss962xxx8510.6用指向結(jié)構(gòu)體的指針變量作函數(shù)參數(shù)示例structstudent{intnum;charname[20];intscore;}main(){voidprint(structstudent*p);structstudentstu;stu.num=12345;strcpy(,"LILI");stu.score=67.5;print(&stu);}voidprint(structstudent*p){printf("NO.=%d,NAME=%s,SCORE=%d",p->num,p->name,p->score);printf("\n");}10.7用整個(gè)結(jié)構(gòu)體變量作為函數(shù)參數(shù)structstudent{intnum;charname[20];intscore;}main(){voidprint(structstudentp);structstudentstu;stu.num=12345;strcpy(,"LILI");stu.score=67.5;print(stu);}voidprint(structstudents1){printf("NO.=%d,Name=%s,Score=%d",s1.num,,s1.score);printf("\n");}練習(xí)1.若有以下說(shuō)明和定義typedefint*INTEGER;INTEGERp,*q;以下敘述正確的是()。A.p是int型變量B.p是基類(lèi)型為int的指針變量C.q是基類(lèi)型為int的指針變量D.程序中可用INTEGER代替int類(lèi)型名2.以下選項(xiàng)中,能定義s為合法的結(jié)構(gòu)體變量的是()。A.typedefstructabcB.struct{doublea;{doublea;

charb[10];charb[10];

}s;}s;C.structABCD.typedefABC{doublea;{doublea;

charb[10];charb[10];

}}ABCs;ABCs;

3.設(shè)有以下定義語(yǔ)句typedefstruct{intn;

charch[8];

}PER;則下面敘述中正確的是()。

A.PER是結(jié)構(gòu)體變量名

B.PER是結(jié)構(gòu)體類(lèi)型名

C.typedefstruct是結(jié)構(gòu)體類(lèi)型

D.struct是結(jié)構(gòu)體類(lèi)型名

4.設(shè)有以下定義structss{charname[10];

intage;

charsex;

}std[3],*p=std;下面各輸入語(yǔ)句中錯(cuò)誤的是()。

A.scanf(“%d”,&(*p).age);

B.scanf("%s",&);

C.scanf(“%c”,&std[0].sex);

D.scanf("%c",&(p->sex));上節(jié)回顧structstudent{intnum;

charname[20];

};

structstudentstd,sp[2];

charname[20];inti;numnamestdspname...std.num,,namescanf(“%d%d”,&std.num,&i);scanf(“%s%s”,,name);1、共用體的概念共用體是指不同類(lèi)型的數(shù)據(jù)可以在不同的時(shí)間內(nèi)使用共同的內(nèi)存單元。共用體實(shí)際上是c語(yǔ)言提供的一種覆蓋技術(shù)。10.3共用體charsexintnumfloatscore10.3.1共用體的定義和使用

“共用體”類(lèi)型變量的定義形式為:

union共用體名

{類(lèi)型名1共用體成員名表1;類(lèi)型名2共用體成員名表2;

……

類(lèi)型名n共用體成員名表n;

};unionstudent

{intnum;

charsex;

floatscore;

}stu1,stu2;charsexintnumfloatscore也可以將類(lèi)型定義與變量定義分開(kāi),例如:

unionstudent

{intnum;

charsex;

floatscore;

};unionstudentstu1,stu2;charsexintnumfloatscore3、共用體變量的引用方式共用體的使用也與結(jié)構(gòu)體相同,用&取共用體的地址,用“.”或“-〉”訪問(wèn)共用體成員。例如:

stu1.num(引用共用體變量中的整型變量num)

stu1.sex(引用共用體變量中的字符變量sex)

stu1.score(引用共用體變量中的實(shí)型變量score)1、同一個(gè)內(nèi)存段可以用來(lái)存放幾種不同類(lèi)型的成員,但在每一瞬時(shí)

溫馨提示

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