第11章結(jié)構(gòu)體與共用_第1頁
第11章結(jié)構(gòu)體與共用_第2頁
第11章結(jié)構(gòu)體與共用_第3頁
第11章結(jié)構(gòu)體與共用_第4頁
第11章結(jié)構(gòu)體與共用_第5頁
免費(fèi)預(yù)覽已結(jié)束,剩余39頁可下載查看

下載本文檔

版權(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ì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論