




下載本文檔
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1第11章結(jié)構(gòu)體與共用體南京信息工程大學(xué)計(jì)算機(jī)系C
語言程序設(shè)計(jì)2023/1/172第11章結(jié)構(gòu)體與共用體11.1概述11.2定義結(jié)構(gòu)體類型變量的方法11.3結(jié)構(gòu)體變量的引用11.4結(jié)構(gòu)體變量的初始化11.5結(jié)構(gòu)體數(shù)組11.6指向結(jié)構(gòu)體類型數(shù)據(jù)的指針11.7用指針處理鏈表11.8共用體11.9枚舉類型11.10用typedef定義類型2023/1/173一個學(xué)生的信息有學(xué)號、姓名、性別、年齡、住址、成績等。一本圖書的信息有分類編號、書名、作者、出版社、出版日期、價格、庫存量等。如何描述這些類型不同的相關(guān)數(shù)據(jù)?11.1概述?信息管理結(jié)構(gòu)體——一種構(gòu)造類型數(shù)據(jù)
結(jié)構(gòu)體由若干不同類型的數(shù)據(jù)項(xiàng)組成,構(gòu)成結(jié)構(gòu)體的各個數(shù)據(jù)項(xiàng)稱為結(jié)構(gòu)體成員。2023/1/174
struct結(jié)構(gòu)體名{數(shù)據(jù)類型1成員名1;數(shù)據(jù)類型2成員名2;……數(shù)據(jù)類型n成員名n;
};11.1概述結(jié)構(gòu)體類型定義的一般形式:
struct為關(guān)鍵字;結(jié)構(gòu)體名是用戶定義的類型標(biāo)識。{}中是組成該結(jié)構(gòu)體的成員。成員的數(shù)據(jù)類型可以是C語言所允許的任何數(shù)據(jù)類型。2023/1/175例如圖書類型的定義:
structbookcard{charnum[10];/*圖書分類編號是字符數(shù)組類型*/charname[30];/*書名是字符數(shù)組類型*/
charauthor[30];/*作者是字符數(shù)組類型*/charpublisher[60];/*出版社是字符數(shù)組類型*/
floatprice;/*價格是單精度實(shí)型*/
intn;/*庫存量是整型*/
};例如學(xué)生類型的定義:structstudent{charnum[8];/*學(xué)號是字符數(shù)組類型*/charname[30];/*姓名是字符數(shù)組類型*/charsex;/*性別是字符型
*/intage;/*年齡是整型
*/
charaddr[60];/*住址是字符數(shù)組類型*/intscore[6];/*成績是整型數(shù)組類型*/
};2023/1/176先聲明結(jié)構(gòu)體類型再定義變量名struct結(jié)構(gòu)體名
變量名表;例如:structbookcardbook1;structstudents,t1,t2;按照結(jié)構(gòu)體類型的組成,系統(tǒng)為定義的結(jié)構(gòu)體變量分配內(nèi)存單元。結(jié)構(gòu)體變量的各個成員在內(nèi)存中占用連續(xù)存儲區(qū)域,結(jié)構(gòu)體變量所占內(nèi)存大小為結(jié)構(gòu)體中每個成員所占用內(nèi)存的長度之和。structstudentnum8個字節(jié)name30個字節(jié)sex1個字節(jié)age2個字節(jié)addr60個字節(jié)score12個字節(jié)11.2定義結(jié)構(gòu)體類型變量的方法2023/1/177結(jié)構(gòu)體類型與變量的說明類型與變量是不同的概念。應(yīng)先定義一個結(jié)構(gòu)體類型,而后再定義結(jié)構(gòu)體變量。系統(tǒng)對類型不分配空間,僅對變量分配空間。只能對變量賦值、存取或運(yùn)算,而不能對一個類型賦值、存取或運(yùn)算。成員也可以是結(jié)構(gòu)變量。對結(jié)構(gòu)中的成員,可以單獨(dú)使用,它的作用與地位相當(dāng)于普通變量。成員名可與程序中的變量名相同,也可與不同結(jié)構(gòu)體類型的成員名相同,二者代表不同的對象。
structdate{intyear,month,day;};structstudent{charnum[8];charname[30];charsex;
structdatebirthday;/*成員為結(jié)構(gòu)體類型*/
charaddr[60];intscore[6];
};num8個字節(jié)name30個字節(jié)sex1個字節(jié)birthdayyear2個字節(jié)month2個字節(jié)day2個字節(jié)addr60個字節(jié)score12個字節(jié)2023/1/178在聲明類型的同時定義變量例如:structstudent{charnum[8],name[20],sex;intage;floatscore;
}st;struct結(jié)構(gòu)體名{
成員定義表;
}變量名表;11.2定義結(jié)構(gòu)體類型變量的方法2023/1/179直接定義結(jié)構(gòu)體類型變量
例如:struct{charnum[8],name[20],sex;intage;floatscore;
}st,a,b,c;struct{
成員定義表;
}變量名表;11.2定義結(jié)構(gòu)體類型變量的方法2023/1/1710結(jié)構(gòu)體變量成員引用的一般形式:結(jié)構(gòu)體變量名.成員名
結(jié)構(gòu)體變量a的各成員可分別表示為a.num、、a.sex、a.birthday、a.score
structdate{intyear,month,day;};structstudent{charnum[8],name[20],sex;structdatebirthday;floatscore;}a;“.”是分量運(yùn)算符,運(yùn)算級別最高。a.birthday.year
a.birthday.month
a.birthday.day
結(jié)構(gòu)體變量的各個成員可進(jìn)行何種運(yùn)算,由該成員的數(shù)據(jù)類型決定
11.3結(jié)構(gòu)體變量的引用2023/1/171111.3結(jié)構(gòu)體變量的引用用sizeof運(yùn)算符計(jì)算結(jié)構(gòu)體變量所占內(nèi)存空間
structdate{intyear,month,day;};structstudent{charnum[8],name[20],sex;structdatebirthday;floatscore;}a;
sizeof(a)
的結(jié)果為8+20+1+6+4=39
sizeof(structstudent)
的結(jié)果為39
2023/1/1712同類型結(jié)構(gòu)體變量之間的賦值運(yùn)算結(jié)構(gòu)體變量之間進(jìn)行賦值時,系統(tǒng)將按成員一一對應(yīng)賦值。structdate{intyear,month,day;};structstudent{charnum[8],name[20],sex;structdatebirthday;floatscore;}a={"9606011","Liming",'M',{1977,12,9},83},b,c;c=a;11.3結(jié)構(gòu)體變量的引用2023/1/1713可以引用結(jié)構(gòu)體成員的地址,也可以引用結(jié)構(gòu)體變量的地址
structdate{intyear,month,day;};structstudent{charnum[8],name[20],sex;structdatebirthday;floatscore;}a;對結(jié)構(gòu)體變量a進(jìn)行
&a運(yùn)算,可以得到a的首地址,它是結(jié)構(gòu)體類型指針。
11.3結(jié)構(gòu)體變量的引用2023/1/171411.4結(jié)構(gòu)體變量的初始化
【例11.4】結(jié)構(gòu)體變量的初始化。structdate{intyear,month,day;};structstudent{charnum[8],name[20],sex;structdatebirthday;floatscore;}a={"9606011","Liming",'M',{1977,12,9},83},b={"9608025","Zhangliming",'F',{1978,5,10},87},c;
如果初值個數(shù)少于結(jié)構(gòu)體成員個數(shù),
則將無初值對應(yīng)的成員賦以0值。
如果初值個數(shù)多于結(jié)構(gòu)體成員個數(shù),
則編譯出錯。2023/1/1715結(jié)構(gòu)體數(shù)組的定義三種形式:形式一:
structstudent{intnum;charname[20];charsex;intage;};structstudentstu[2];形式二:
structstudent{intnum;charname[20];charsex;intage;}stu[2];形式三:
struct{intnum;charname[20];charsex;intage;}stu[2];numnamesexagenumnamesexagestu[0]stu[1]25B11.5結(jié)構(gòu)體數(shù)組2023/1/1716例struct{intnum;charname[20];charsex;intage;}stu[]={{……},{……},{……}};結(jié)構(gòu)體數(shù)組引用引用方式:結(jié)構(gòu)體數(shù)組名[下標(biāo)].成員名
structstudent{intnum;charname[20];charsex;intage;}str[3];stu[1].age++;strcpy(stu[0].name,”ZhaoDa”);11.5結(jié)構(gòu)體數(shù)組2023/1/1717【例11.5】結(jié)構(gòu)體數(shù)組的初始化。structs{charnum[8],name[20],sex;floatscore;}stu[3]={{"9606011","Liming",'M',87.5},
{"9606012","Zhangjiangguo",'M',79},{"9606013","Wangping",'F',90}};
元素的個數(shù)可以省略,根據(jù)賦初值時
結(jié)構(gòu)體常量的個數(shù)確定數(shù)組元素的個數(shù)
11.5結(jié)構(gòu)體數(shù)組
2023/1/1718structperson{charname[20];intcount;}leader[3]={“Li”,0,“Zhang”,0,”Wang“,0};main(){inti,j;charleader_name[20];
for(i=1;i<=10;i++){scanf("%s",leader_name);
for(j=0;j<3;j++) if(strcmp(leader_name,leader[j].name)==0) leader[j].count++;}for(i=0;i<3;i++)printf("%5s:%d\n",leader[i].name,leader[i].count);}namecountLiZhangWang000例統(tǒng)計(jì)候選人選票2023/1/171911.6指向結(jié)構(gòu)體類型數(shù)據(jù)的指針結(jié)構(gòu)體指針變量定義的一般形式:
struct結(jié)構(gòu)體名
*指針變量名;structdate{intyear,month,day;}*q;例如:structstudent*p;p是指向structstudent結(jié)構(gòu)體變量的指針變量
1.指向結(jié)構(gòu)體變量的指針
2023/1/17202.結(jié)構(gòu)體成員的三種引用形式
用結(jié)構(gòu)體變量名的引用形式:
d.year
d.month
d.daystructdate{intyear,month,day;}d,*p=&d;
用結(jié)構(gòu)體指針變量的引用形式:(*p).year(*p).month(*p).dayp->yearp->monthp->day“->”是指向結(jié)構(gòu)體成員運(yùn)算符,優(yōu)先級為一級
11.6指向結(jié)構(gòu)體類型數(shù)據(jù)的指針2023/1/1721
【例9_a】輸入今天的日期,然后輸出該日期。
main() {structdate
/*在函數(shù)中定義結(jié)構(gòu)體類型*/
{
intyear,month,day;
}today,*p=&today;
/*定義結(jié)構(gòu)體變量及其指針*/
printf("Entertodaydate(YYYY/MM/DD):"); scanf("%d/%d/%d",&today.year,&today.month,
&today.day);printf("Today:%d/%d/%d\n",p->year,p->month,p->day); }11.6指向結(jié)構(gòu)體類型數(shù)據(jù)的指針2023/1/1722【例11.8】分析自增自減運(yùn)算對程序結(jié)果的影響。structcode{inti;charc;}a[]={{100,'A'},{200,'B'},{300,'C'},{400,'D'}};a數(shù)組100a[0]'A'200a[1]'B'300a[2]'C'400a[3]'D'11.6指向結(jié)構(gòu)體類型數(shù)據(jù)的指針2023/1/1723main(){structcode*p=a;printf("%d\t",++p->i);printf("%c\t",(++p)->c);printf("%d\t",(p++)->i);printf("%c\t",++p->c);printf("%d\t",p->i++);printf("%d\n",p->i);}a數(shù)組100a[0]'A'200a[1]'B'300a[2]'C'400a[3]'D'p101'D'301101B200D30030111.6指向結(jié)構(gòu)體類型數(shù)據(jù)的指針2023/1/17244.用結(jié)構(gòu)體變量和指向結(jié)構(gòu)體的指針作函數(shù)參數(shù)方法一:在函數(shù)之間直接傳遞結(jié)構(gòu)體數(shù)據(jù)。函數(shù)的形參定義為結(jié)構(gòu)體變量。函數(shù)調(diào)用時,可將主調(diào)函數(shù)的結(jié)構(gòu)體類型實(shí)參傳遞給被調(diào)函數(shù)的形參。如果將函數(shù)定義為結(jié)構(gòu)體類型函數(shù),可利用return語句將一個結(jié)構(gòu)體數(shù)據(jù)結(jié)果返回到主調(diào)函數(shù)中。11.6指向結(jié)構(gòu)體類型數(shù)據(jù)的指針2023/1/1725方法二:在函數(shù)之間傳遞結(jié)構(gòu)體指針。
形參定義為指向結(jié)構(gòu)體類型的指針變量,可將主調(diào)函數(shù)的結(jié)構(gòu)體指針傳遞給被調(diào)函數(shù)的形參變量,通過指針形參的指向域的擴(kuò)展,操作主調(diào)函數(shù)中結(jié)構(gòu)體變量及其成員。如果將函數(shù)定義為結(jié)構(gòu)體指針型函數(shù),可利用return語句將被調(diào)函數(shù)中結(jié)構(gòu)體變量的指針返回給主調(diào)函數(shù)的結(jié)構(gòu)體指針變量。方法三:利用全局結(jié)構(gòu)體變量傳遞結(jié)構(gòu)體數(shù)據(jù)。4.用結(jié)構(gòu)體變量和指向結(jié)構(gòu)體的指針作函數(shù)參數(shù)11.6指向結(jié)構(gòu)體類型數(shù)據(jù)的指針2023/1/1726structdata{inta,b,c;};voidmain(){voidfunc(structdata);structdataarg;arg.a=27;arg.b=3;arg.c=arg.a+arg.b;printf("arg.a=%darg.b=%darg.c=%d\n",arg.a,arg.b,arg.c);printf("CallFunc()....\n");
func(arg);printf("arg.a=%darg.b=%darg.c=%d\n",arg.a,arg.b,arg.c);}voidfunc(structdataparm){printf("parm.a=%dparm.b=%dparm.c=%d\n",parm.a,parm.b,parm.c);printf("Process...\n");parm.a=18;parm.b=5;parm.c=parm.a*parm.b;printf("parm.a=%dparm.b=%dparm.c=%d\n",parm.a,parm.b,parm.c);printf("Return...\n");}arga:27b:3c:30(main)(func)parma:27b:3c:30copyarga:27b:3c:30(main)(func)parma:18b:5c:90arga:27b:3c:30(main)arga:27b:3c:30(main)例用結(jié)構(gòu)體變量作函數(shù)參數(shù)2023/1/1727structdata{inta,b,c;};voidmain(){voidfunc(structdata*parm);structdataarg;arg.a=27;arg.b=3;arg.c=arg.a+arg.b;printf("arg.a=%darg.b=%darg.c=%d\n",arg.a,arg.b,arg.c);printf("CallFunc()....\n");
func(&arg);printf("arg.a=%darg.b=%darg.c=%d\n",arg.a,arg.b,arg.c);}voidfunc(structdata*parm){printf("parm->a=%dparm->b=%dparm->c=%d\n",parm->a,parm->b,parm->c);printf("Process...\n");parm->a=18;parm->b=5;parm->c=parm->a*parm->b;printf("parm->a=%dparm->b=%dparm->c=%d\n",parm->a,parm->b,parm->c);printf("Return...\n");}arga:18b:5c:90(main)arga:27b:3c:30(main)例用結(jié)構(gòu)體指針變量作函數(shù)參數(shù)arga:27b:3c:30(main)(func)parm****arga:18b:5c:90(main)(func)parm****2023/1/1728結(jié)構(gòu)體類型解決了如何描述一個邏輯上相關(guān),但數(shù)據(jù)類型不同的一組分量的集合。在需要節(jié)省內(nèi)存儲空間時,c語言還提供了一種由若干個不同類型的數(shù)據(jù)項(xiàng)組成,但共享同一存儲空間的構(gòu)造類型。11.8共用體11.8.1共用體的概念共用體——一種構(gòu)造類型數(shù)據(jù)
共用體由若干不同類型的數(shù)據(jù)項(xiàng)組成,構(gòu)成共用體的各個數(shù)據(jù)項(xiàng)稱為共用體成員。由于共享的特性,只有最新存儲的數(shù)據(jù)是有效的。2023/1/1729
union共用體名{數(shù)據(jù)類型1成員名1;數(shù)據(jù)類型2成員名2;……數(shù)據(jù)類型n成員名n;
};共用體類型定義的一般形式:
union為關(guān)鍵字;共用體名是用戶定義的類型標(biāo)識。{}中是組成該共用體的成員。成員的數(shù)據(jù)類型可以是C語言所允許的任何數(shù)據(jù)類型。11.8共用體11.8.1共用體的概念2023/1/1730例如:
unionutype{
inti;charch;longl;charc[4];
};
定義了一個unionutype共用體
類型,共用體類型定義不分配內(nèi)存空間,只是說明此類型數(shù)據(jù)的組成情況。
11.8共用體11.8.1共用體的概念2023/1/1731u1變量chu1變量iu1變量l1.共用體變量的定義
利用已定義的共用體類型名定義變量union共用體名
變量名表;例如:unionutypeu1,u2;按照共用體類型的組成,系統(tǒng)為定義的共用體變量分配內(nèi)存單元。共用體變量所占內(nèi)存大小等于共用體中占用內(nèi)存的長度最長的成員。u1變量cc[0]c[1]c[2]c[3]11.8共用體11.8.1共用體的概念2023/1/17321.共用體變量的定義
在定義共用體類型的同時定義變量例如:
unionutype{
inti;charch;longl;charc[4];
}a,b,c;union共用體名{
成員定義表;
}變量名表;11.8共用體11.8.1共用體的概念2023/1/17331.共用體變量的定義
直接定義共用體類型變量
例如:
union{
inti;charch;longl;charc[4];
}a,b,c;union{
成員定義表;
}變量名表;11.8共用體11.8.1共用體的概念2023/1/1734用sizeof運(yùn)算符計(jì)算共用體變量所占內(nèi)存空間
unionutype{
inti;charch;longl;charc[4];
}a,b,c;
sizeof(a)
的結(jié)果為4
sizeof(unionutype)
的結(jié)果為4
11.8共用體11.8.2共用體變量的引用方式
2023/1/1735同類型共用體變量之間的賦值運(yùn)算共用體變量之間進(jìn)行賦值時,系統(tǒng)僅賦當(dāng)前有效
成員的值(即最新存儲的數(shù)據(jù))。
unionutype{
inti;charch;longl;charc[4];
}a,*p=&a;對共用體變量進(jìn)行取址運(yùn)算11.8共用體11.8.2共用體變量的引用方式
2023/1/1736共用體變量成員的引用有三種形式。例如:
unionu{charu1;intu2;}x,*p=&x;
用共用體變量名的引用形式:
x.u1
x.u2
用共用體指針變量的引用形式:(*p).u1(*p).u2p->u1p->u211.8共用體11.8.2共用體變量的引用方式
2023/1/1737【例11.18】共用體變量賦初值。unionu{charu1;intu2;};main(){unionua={0x9741};printf("1.%c%x\n",a.u1,a.u2);a.u1='a';printf("2.%c%x\n",a.u1,a.u2);}
共用體類型變量在定義時只能對第一
個成員進(jìn)行賦初值。
由于第一個成員是字符型,用一個字
節(jié),所以對于初值0x9741僅能接受0x41,
初值的高字節(jié)被截去。
1.A412.a61對u2成員的引用是無意義的11.8共用體11.8.2共用體變量的引用方式
2023/1/1738main(){union{longn;intk;charc;}un;un.n=0x12345678;printf("%lx\n",un.n);printf("%x\n",un.k);printf("%x\n",un.c);un.c='A';printf("%ld\n",un.n);printf("%d\n",un.k);printf("%c\n",un.c);}1234567856787830541984122081A0x780x560x340x12低地址高地址0x120x340x560x4100010010001101000101011001000001高地址低地址11.8共用體11.8.2共用體
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025-2030年中國鍍硅鋼卷行業(yè)運(yùn)行狀況及發(fā)展前景分析報告
- 2025-2030年中國鋰電池鋁塑膜行業(yè)運(yùn)營狀況及發(fā)展前景分析報告
- 2025-2030年中國鈾資源產(chǎn)業(yè)運(yùn)行動態(tài)及發(fā)展趨勢分析報告
- 2025-2030年中國輕鋼結(jié)構(gòu)行業(yè)十三五規(guī)劃及發(fā)展策略分析報告
- 2025-2030年中國航空保險行業(yè)市場深度調(diào)查及投資前景預(yù)測報告
- 2025-2030年中國羊毛衫市場十三五規(guī)劃及發(fā)展趨勢分析報告
- 2025-2030年中國稀釋劑市場運(yùn)行狀況及前景趨勢分析報告
- 2025山西省安全員《C證》考試題庫
- 河北石油職業(yè)技術(shù)大學(xué)《舞弊審計(jì)》2023-2024學(xué)年第二學(xué)期期末試卷
- 2025年重慶市建筑安全員考試題庫
- 電梯控制技術(shù)PPT完整全套教學(xué)課件
- 甲狀腺旁腺分泌的激素及功能
- 中央財(cái)政成品油價格調(diào)整對漁業(yè)補(bǔ)助資金項(xiàng)目實(shí)施方案
- PFMEA模板完整版文檔
- 論生產(chǎn)安全對于家庭的重要性
- 風(fēng)力發(fā)電變槳系統(tǒng)外文翻譯
- 教學(xué)能力比賽決賽 《英語》教案
- ECMO IABP完整版可編輯
- 離婚糾紛證據(jù)清單
- 【高考作文指導(dǎo)】用思辨來寫現(xiàn)象類作文(共39張PPT)
- GB/T 4513-2000不定形耐火材料分類
評論
0/150
提交評論