下載本文檔
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
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一個(gè)學(xué)生的信息有學(xué)號(hào)、姓名、性別、年齡、住址、成績(jī)等。一本圖書的信息有分類編號(hào)、書名、作者、出版社、出版日期、價(jià)格、庫存量等。如何描述這些類型不同的相關(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)體的各個(gè)數(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)識(shí)。{}中是組成該結(jié)構(gòu)體的成員。成員的數(shù)據(jù)類型可以是C語言所允許的任何數(shù)據(jù)類型。2023/1/175例如圖書類型的定義:
structbookcard{charnum[10];/*圖書分類編號(hào)是字符數(shù)組類型*/charname[30];/*書名是字符數(shù)組類型*/
charauthor[30];/*作者是字符數(shù)組類型*/charpublisher[60];/*出版社是字符數(shù)組類型*/
floatprice;/*價(jià)格是單精度實(shí)型*/
intn;/*庫存量是整型*/
};例如學(xué)生類型的定義:structstudent{charnum[8];/*學(xué)號(hào)是字符數(shù)組類型*/charname[30];/*姓名是字符數(shù)組類型*/charsex;/*性別是字符型
*/intage;/*年齡是整型
*/
charaddr[60];/*住址是字符數(shù)組類型*/intscore[6];/*成績(jī)是整型數(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)體變量的各個(gè)成員在內(nèi)存中占用連續(xù)存儲(chǔ)區(qū)域,結(jié)構(gòu)體變量所占內(nèi)存大小為結(jié)構(gòu)體中每個(gè)成員所占用內(nèi)存的長(zhǎng)度之和。structstudentnum8個(gè)字節(jié)name30個(gè)字節(jié)sex1個(gè)字節(jié)age2個(gè)字節(jié)addr60個(gè)字節(jié)score12個(gè)字節(jié)11.2定義結(jié)構(gòu)體類型變量的方法2023/1/177結(jié)構(gòu)體類型與變量的說明類型與變量是不同的概念。應(yīng)先定義一個(gè)結(jié)構(gòu)體類型,而后再定義結(jié)構(gòu)體變量。系統(tǒng)對(duì)類型不分配空間,僅對(duì)變量分配空間。只能對(duì)變量賦值、存取或運(yùn)算,而不能對(duì)一個(gè)類型賦值、存取或運(yùn)算。成員也可以是結(jié)構(gòu)變量。對(duì)結(jié)構(gòu)中的成員,可以單獨(dú)使用,它的作用與地位相當(dāng)于普通變量。成員名可與程序中的變量名相同,也可與不同結(jié)構(gòu)體類型的成員名相同,二者代表不同的對(duì)象。
structdate{intyear,month,day;};structstudent{charnum[8];charname[30];charsex;
structdatebirthday;/*成員為結(jié)構(gòu)體類型*/
charaddr[60];intscore[6];
};num8個(gè)字節(jié)name30個(gè)字節(jié)sex1個(gè)字節(jié)birthdayyear2個(gè)字節(jié)month2個(gè)字節(jié)day2個(gè)字節(jié)addr60個(gè)字節(jié)score12個(gè)字節(jié)2023/1/178在聲明類型的同時(shí)定義變量例如: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)算級(jí)別最高。a.birthday.year
a.birthday.month
a.birthday.day
結(jié)構(gòu)體變量的各個(gè)成員可進(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)行賦值時(shí),系統(tǒng)將按成員一一對(duì)應(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;對(duì)結(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;
如果初值個(gè)數(shù)少于結(jié)構(gòu)體成員個(gè)數(shù),
則將無初值對(duì)應(yīng)的成員賦以0值。
如果初值個(gè)數(shù)多于結(jié)構(gòu)體成員個(gè)數(shù),
則編譯出錯(cuò)。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}};
元素的個(gè)數(shù)可以省略,根據(jù)賦初值時(shí)
結(jié)構(gòu)體常量的個(gè)數(shù)確定數(shù)組元素的個(gè)數(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)先級(jí)為一級(jí)
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)算對(duì)程序結(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)用時(shí),可將主調(diào)函數(shù)的結(jié)構(gòu)體類型實(shí)參傳遞給被調(diào)函數(shù)的形參。如果將函數(shù)定義為結(jié)構(gòu)體類型函數(shù),可利用return語句將一個(gè)結(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)體類型解決了如何描述一個(gè)邏輯上相關(guān),但數(shù)據(jù)類型不同的一組分量的集合。在需要節(jié)省內(nèi)存儲(chǔ)空間時(shí),c語言還提供了一種由若干個(gè)不同類型的數(shù)據(jù)項(xiàng)組成,但共享同一存儲(chǔ)空間的構(gòu)造類型。11.8共用體11.8.1共用體的概念共用體——一種構(gòu)造類型數(shù)據(jù)
共用體由若干不同類型的數(shù)據(jù)項(xiàng)組成,構(gòu)成共用體的各個(gè)數(shù)據(jù)項(xiàng)稱為共用體成員。由于共享的特性,只有最新存儲(chǔ)的數(shù)據(jù)是有效的。2023/1/1729
union共用體名{數(shù)據(jù)類型1成員名1;數(shù)據(jù)類型2成員名2;……數(shù)據(jù)類型n成員名n;
};共用體類型定義的一般形式:
union為關(guān)鍵字;共用體名是用戶定義的類型標(biāo)識(shí)。{}中是組成該共用體的成員。成員的數(shù)據(jù)類型可以是C語言所允許的任何數(shù)據(jù)類型。11.8共用體11.8.1共用體的概念2023/1/1730例如:
unionutype{
inti;charch;longl;charc[4];
};
定義了一個(gè)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)存的長(zhǎng)度最長(zhǎng)的成員。u1變量cc[0]c[1]c[2]c[3]11.8共用體11.8.1共用體的概念2023/1/17321.共用體變量的定義
在定義共用體類型的同時(shí)定義變量例如:
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)行賦值時(shí),系統(tǒng)僅賦當(dāng)前有效
成員的值(即最新存儲(chǔ)的數(shù)據(jù))。
unionutype{
inti;charch;longl;charc[4];
}a,*p=&a;對(duì)共用體變量進(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);}
共用體類型變量在定義時(shí)只能對(duì)第一
個(gè)成員進(jìn)行賦初值。
由于第一個(gè)成員是字符型,用一個(gè)字
節(jié),所以對(duì)于初值0x9741僅能接受0x41,
初值的高字節(jié)被截去。
1.A412.a61對(duì)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等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024年餐飲酒店服務(wù)質(zhì)量提升合同
- 2025農(nóng)村個(gè)人魚塘承包合同
- 醫(yī)療設(shè)備采購監(jiān)管工作要點(diǎn)
- 工程賠償電力施工合同范本
- 村委會(huì)農(nóng)村醫(yī)療設(shè)施協(xié)議
- ??谑畜w育館租賃合同樣本
- 煙花爆竹燃放安全指南
- 2025黃金買賣合同書范文
- 廣告?zhèn)髅焦綜EO聘用合同
- 電商直播會(huì)計(jì)崗位招聘合同
- 河北省保定市2023-2024學(xué)年高二上學(xué)期期末調(diào)研數(shù)學(xué)試題(含答案解析)
- LS/T 1234-2023植物油儲(chǔ)存品質(zhì)判定規(guī)則
- 2016-2023年江蘇醫(yī)藥職業(yè)學(xué)院高職單招(英語/數(shù)學(xué)/語文)筆試歷年參考題庫含答案解析
- 提醒關(guān)電關(guān)水關(guān)門注意安全的公告
- 箱變檢測(cè)報(bào)告
- 河南省商丘市民權(quán)縣2023-2024學(xué)年八年級(jí)上學(xué)期期末語文試題
- 初中教師教學(xué)基本功培訓(xùn)內(nèi)容課件
- 工業(yè)互聯(lián)網(wǎng)平臺(tái)建設(shè)方案
- 精準(zhǔn)醫(yī)療的商業(yè)模式
- 2023-2024學(xué)年四川省成都市金牛區(qū)八年級(jí)(上)期末數(shù)學(xué)試卷
- 海南省省直轄縣級(jí)行政單位樂東黎族自治縣2023-2024學(xué)年九年級(jí)上學(xué)期期末數(shù)學(xué)試題
評(píng)論
0/150
提交評(píng)論