下載本文檔
版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1第11章結構體與共用體南京信息工程大學計算機系C
語言程序設計2023/1/172第11章結構體與共用體11.1概述11.2定義結構體類型變量的方法11.3結構體變量的引用11.4結構體變量的初始化11.5結構體數(shù)組11.6指向結構體類型數(shù)據(jù)的指針11.7用指針處理鏈表11.8共用體11.9枚舉類型11.10用typedef定義類型2023/1/173一個學生的信息有學號、姓名、性別、年齡、住址、成績等。一本圖書的信息有分類編號、書名、作者、出版社、出版日期、價格、庫存量等。如何描述這些類型不同的相關數(shù)據(jù)?11.1概述?信息管理結構體——一種構造類型數(shù)據(jù)
結構體由若干不同類型的數(shù)據(jù)項組成,構成結構體的各個數(shù)據(jù)項稱為結構體成員。2023/1/174
struct結構體名{數(shù)據(jù)類型1成員名1;數(shù)據(jù)類型2成員名2;……數(shù)據(jù)類型n成員名n;
};11.1概述結構體類型定義的一般形式:
struct為關鍵字;結構體名是用戶定義的類型標識。{}中是組成該結構體的成員。成員的數(shù)據(jù)類型可以是C語言所允許的任何數(shù)據(jù)類型。2023/1/175例如圖書類型的定義:
structbookcard{charnum[10];/*圖書分類編號是字符數(shù)組類型*/charname[30];/*書名是字符數(shù)組類型*/
charauthor[30];/*作者是字符數(shù)組類型*/charpublisher[60];/*出版社是字符數(shù)組類型*/
floatprice;/*價格是單精度實型*/
intn;/*庫存量是整型*/
};例如學生類型的定義:structstudent{charnum[8];/*學號是字符數(shù)組類型*/charname[30];/*姓名是字符數(shù)組類型*/charsex;/*性別是字符型
*/intage;/*年齡是整型
*/
charaddr[60];/*住址是字符數(shù)組類型*/intscore[6];/*成績是整型數(shù)組類型*/
};2023/1/176先聲明結構體類型再定義變量名struct結構體名
變量名表;例如:structbookcardbook1;structstudents,t1,t2;按照結構體類型的組成,系統(tǒng)為定義的結構體變量分配內存單元。結構體變量的各個成員在內存中占用連續(xù)存儲區(qū)域,結構體變量所占內存大小為結構體中每個成員所占用內存的長度之和。structstudentnum8個字節(jié)name30個字節(jié)sex1個字節(jié)age2個字節(jié)addr60個字節(jié)score12個字節(jié)11.2定義結構體類型變量的方法2023/1/177結構體類型與變量的說明類型與變量是不同的概念。應先定義一個結構體類型,而后再定義結構體變量。系統(tǒng)對類型不分配空間,僅對變量分配空間。只能對變量賦值、存取或運算,而不能對一個類型賦值、存取或運算。成員也可以是結構變量。對結構中的成員,可以單獨使用,它的作用與地位相當于普通變量。成員名可與程序中的變量名相同,也可與不同結構體類型的成員名相同,二者代表不同的對象。
structdate{intyear,month,day;};structstudent{charnum[8];charname[30];charsex;
structdatebirthday;/*成員為結構體類型*/
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結構體名{
成員定義表;
}變量名表;11.2定義結構體類型變量的方法2023/1/179直接定義結構體類型變量
例如:struct{charnum[8],name[20],sex;intage;floatscore;
}st,a,b,c;struct{
成員定義表;
}變量名表;11.2定義結構體類型變量的方法2023/1/1710結構體變量成員引用的一般形式:結構體變量名.成員名
結構體變量a的各成員可分別表示為a.num、、a.sex、a.birthday、a.score
structdate{intyear,month,day;};structstudent{charnum[8],name[20],sex;structdatebirthday;floatscore;}a;“.”是分量運算符,運算級別最高。a.birthday.year
a.birthday.month
a.birthday.day
結構體變量的各個成員可進行何種運算,由該成員的數(shù)據(jù)類型決定
11.3結構體變量的引用2023/1/171111.3結構體變量的引用用sizeof運算符計算結構體變量所占內存空間
structdate{intyear,month,day;};structstudent{charnum[8],name[20],sex;structdatebirthday;floatscore;}a;
sizeof(a)
的結果為8+20+1+6+4=39
sizeof(structstudent)
的結果為39
2023/1/1712同類型結構體變量之間的賦值運算結構體變量之間進行賦值時,系統(tǒ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結構體變量的引用2023/1/1713可以引用結構體成員的地址,也可以引用結構體變量的地址
structdate{intyear,month,day;};structstudent{charnum[8],name[20],sex;structdatebirthday;floatscore;}a;對結構體變量a進行
&a運算,可以得到a的首地址,它是結構體類型指針。
11.3結構體變量的引用2023/1/171411.4結構體變量的初始化
【例11.4】結構體變量的初始化。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ù)少于結構體成員個數(shù),
則將無初值對應的成員賦以0值。
如果初值個數(shù)多于結構體成員個數(shù),
則編譯出錯。2023/1/1715結構體數(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結構體數(shù)組2023/1/1716例struct{intnum;charname[20];charsex;intage;}stu[]={{……},{……},{……}};結構體數(shù)組引用引用方式:結構體數(shù)組名[下標].成員名
structstudent{intnum;charname[20];charsex;intage;}str[3];stu[1].age++;strcpy(stu[0].name,”ZhaoDa”);11.5結構體數(shù)組2023/1/1717【例11.5】結構體數(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ù)賦初值時
結構體常量的個數(shù)確定數(shù)組元素的個數(shù)
11.5結構體數(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)計候選人選票2023/1/171911.6指向結構體類型數(shù)據(jù)的指針結構體指針變量定義的一般形式:
struct結構體名
*指針變量名;structdate{intyear,month,day;}*q;例如:structstudent*p;p是指向structstudent結構體變量的指針變量
1.指向結構體變量的指針
2023/1/17202.結構體成員的三種引用形式
用結構體變量名的引用形式:
d.year
d.month
d.daystructdate{intyear,month,day;}d,*p=&d;
用結構體指針變量的引用形式:(*p).year(*p).month(*p).dayp->yearp->monthp->day“->”是指向結構體成員運算符,優(yōu)先級為一級
11.6指向結構體類型數(shù)據(jù)的指針2023/1/1721
【例9_a】輸入今天的日期,然后輸出該日期。
main() {structdate
/*在函數(shù)中定義結構體類型*/
{
intyear,month,day;
}today,*p=&today;
/*定義結構體變量及其指針*/
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指向結構體類型數(shù)據(jù)的指針2023/1/1722【例11.8】分析自增自減運算對程序結果的影響。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指向結構體類型數(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指向結構體類型數(shù)據(jù)的指針2023/1/17244.用結構體變量和指向結構體的指針作函數(shù)參數(shù)方法一:在函數(shù)之間直接傳遞結構體數(shù)據(jù)。函數(shù)的形參定義為結構體變量。函數(shù)調用時,可將主調函數(shù)的結構體類型實參傳遞給被調函數(shù)的形參。如果將函數(shù)定義為結構體類型函數(shù),可利用return語句將一個結構體數(shù)據(jù)結果返回到主調函數(shù)中。11.6指向結構體類型數(shù)據(jù)的指針2023/1/1725方法二:在函數(shù)之間傳遞結構體指針。
形參定義為指向結構體類型的指針變量,可將主調函數(shù)的結構體指針傳遞給被調函數(shù)的形參變量,通過指針形參的指向域的擴展,操作主調函數(shù)中結構體變量及其成員。如果將函數(shù)定義為結構體指針型函數(shù),可利用return語句將被調函數(shù)中結構體變量的指針返回給主調函數(shù)的結構體指針變量。方法三:利用全局結構體變量傳遞結構體數(shù)據(jù)。4.用結構體變量和指向結構體的指針作函數(shù)參數(shù)11.6指向結構體類型數(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)例用結構體變量作函數(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)例用結構體指針變量作函數(shù)參數(shù)arga:27b:3c:30(main)(func)parm****arga:18b:5c:90(main)(func)parm****2023/1/1728結構體類型解決了如何描述一個邏輯上相關,但數(shù)據(jù)類型不同的一組分量的集合。在需要節(jié)省內存儲空間時,c語言還提供了一種由若干個不同類型的數(shù)據(jù)項組成,但共享同一存儲空間的構造類型。11.8共用體11.8.1共用體的概念共用體——一種構造類型數(shù)據(jù)
共用體由若干不同類型的數(shù)據(jù)項組成,構成共用體的各個數(shù)據(jù)項稱為共用體成員。由于共享的特性,只有最新存儲的數(shù)據(jù)是有效的。2023/1/1729
union共用體名{數(shù)據(jù)類型1成員名1;數(shù)據(jù)類型2成員名2;……數(shù)據(jù)類型n成員名n;
};共用體類型定義的一般形式:
union為關鍵字;共用體名是用戶定義的類型標識。{}中是組成該共用體的成員。成員的數(shù)據(jù)類型可以是C語言所允許的任何數(shù)據(jù)類型。11.8共用體11.8.1共用體的概念2023/1/1730例如:
unionutype{
inti;charch;longl;charc[4];
};
定義了一個unionutype共用體
類型,共用體類型定義不分配內存空間,只是說明此類型數(shù)據(jù)的組成情況。
11.8共用體11.8.1共用體的概念2023/1/1731u1變量chu1變量iu1變量l1.共用體變量的定義
利用已定義的共用體類型名定義變量union共用體名
變量名表;例如:unionutypeu1,u2;按照共用體類型的組成,系統(tǒng)為定義的共用體變量分配內存單元。共用體變量所占內存大小等于共用體中占用內存的長度最長的成員。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運算符計算共用體變量所占內存空間
unionutype{
inti;charch;longl;charc[4];
}a,b,c;
sizeof(a)
的結果為4
sizeof(unionutype)
的結果為4
11.8共用體11.8.2共用體變量的引用方式
2023/1/1735同類型共用體變量之間的賦值運算共用體變量之間進行賦值時,系統(tǒng)僅賦當前有效
成員的值(即最新存儲的數(shù)據(jù))。
unionutype{
inti;charch;longl;charc[4];
}a,*p=&a;對共用體變量進行取址運算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);}
共用體類型變量在定義時只能對第一
個成員進行賦初值。
由于第一個成員是字符型,用一個字
節(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)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年晉江市磁灶鎮(zhèn)人民政府公開招聘編外人員的備考題庫有答案詳解
- 便秘的飲食治療案例分析
- 四川農商聯(lián)合銀行信息科技部2026年校園招聘備考題庫完整答案詳解
- 私募基金電話銷售話術
- 2025年南京市公安局江寧分局公開招聘輔警備考題庫及一套完整答案詳解
- 2025云南大理洱源縣醫(yī)共體鄧川分院招聘編外人員1人考試核心試題及答案解析
- 范縣2023年河南濮陽范縣互聯(lián)網應急指揮中心公開招聘工作人員8人筆試歷年參考題庫典型考點附帶答案詳解(3卷合一)
- 國家事業(yè)單位招聘2024自然資源部信息中心招聘應屆畢業(yè)生筆試歷年參考題庫典型考點附帶答案詳解(3卷合一)
- 麗江職業(yè)技術學院2025年急需緊缺專任教師招聘備考題庫必考題
- 2026貴州貴陽修文縣面向教育部直屬師范大學2026屆公費師范生畢業(yè)生招聘教師備考題庫附答案
- 2025山東青島上合控股發(fā)展集團有限公司社會招聘31人參考筆試試題及答案解析
- 2025年大學康復治療學(運動療法學)試題及答案
- 進出口貨物報關單的填制教案
- 上市公司財務舞弊問題研究-以國美通訊為例
- 四川省教育考試院2025年公開招聘編外聘用人員筆試考試參考試題及答案解析
- 2025年中級煤礦綜采安裝拆除作業(yè)人員《理論知識》考試真題(含解析)
- 2026年鄂爾多斯生態(tài)環(huán)境職業(yè)學院單招職業(yè)適應性測試題庫必考題
- 防噴演練及硫化氫防護流程
- 外貿入職培訓課件大綱
- 2025佛山農商銀行社會招聘考試備考題庫及答案解析
- 混合性認知障礙診治專家共識解讀課件
評論
0/150
提交評論