版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
第11章結(jié)構(gòu)體與聯(lián)合體11.1結(jié)構(gòu)體結(jié)構(gòu)體是一種構(gòu)造數(shù)據(jù)類型用途:把不同類型的數(shù)據(jù)組合成一個(gè)整體-------自定義數(shù)據(jù)類型結(jié)構(gòu)體類型定義struct[結(jié)構(gòu)體名]{
類型標(biāo)識(shí)符成員名;類型標(biāo)識(shí)符成員名;
…………….};成員類型可以是基本型或構(gòu)造型struct是,不能省略合法標(biāo)識(shí)符可省:無名結(jié)構(gòu)體例struct
student{intnum;charname[20];charsex;intage;floatscore;charaddr[30];};namenumsexagescoreaddr2字節(jié)2字節(jié)20字節(jié)1字節(jié)4字節(jié)30字節(jié)……..結(jié)構(gòu)體類型定義描述結(jié)構(gòu)的組織形式,不分配內(nèi)存結(jié)構(gòu)體類型定義的作用域例structstudent{intnum;charname[20];charsex;intage;floatscore;charaddr[30];};
structstudentstu1,stu2;11.2結(jié)構(gòu)體變量的定義先定義結(jié)構(gòu)體類型,再定義結(jié)構(gòu)體變量一般形式:struct結(jié)構(gòu)體名{
類型標(biāo)識(shí)符成員名;類型標(biāo)識(shí)符成員名;
…………….};struct結(jié)構(gòu)體名變量名表列;例#defineSTUDENTstructstudent
STUDENT{intnum;charname[20];charsex;intage;floatscore;charaddr[30];};
STUDENTstu1,stu2;直接定義結(jié)構(gòu)體變量一般形式:struct{
類型標(biāo)識(shí)符成員名;類型標(biāo)識(shí)符成員名;
…………….}變量名表列;例struct{intnum;charname[20];charsex;intage;floatscore;charaddr[30];}stu1,stu2;用無名結(jié)構(gòu)體直接定義變量只能一次說明結(jié)構(gòu)體類型與結(jié)構(gòu)體變量概念不同類型:不分配內(nèi)存;變量:分配內(nèi)存類型:不能賦值、存取、運(yùn)算;變量:可以結(jié)構(gòu)體可嵌套結(jié)構(gòu)體成員名與程序中變量名可相同,不會(huì)混淆結(jié)構(gòu)體類型及變量的作用域與生存期例structdate{intmonth;intday;intyear;};structstudent{intnum;charname[20];
structdatebirthday;}stu;numnamebirthdaymonthdayyear例structstudent{intnum;charname[20];
structdate{intmonth;intday;intyear;}birthday;}stu;numnamebirthdaymonthdayyear11.3結(jié)構(gòu)體變量的引用引用規(guī)則結(jié)構(gòu)體變量不能整體引用,只能引用變量成員可以將一個(gè)結(jié)構(gòu)體變量賦值給另一個(gè)結(jié)構(gòu)體變量結(jié)構(gòu)體嵌套時(shí)逐級(jí)引用成員(分量)運(yùn)算符優(yōu)先級(jí):1結(jié)合性:從左向右引用方式:結(jié)構(gòu)體變量名.成員名例structstudent{intnum;charname[20];charsex;intage;floatscore;charaddr[30];}stu1,stu2;stu1.num=10;stu1.score=85.5;stu1.score+=stu2.score;stu1.age++;例structstudent{intnum;charname[20];charsex;intage;floatscore;charaddr[30];}stu1,stu2;printf(“%d,%s,%c,%d,%f,%s\n”,stu1);()stu1={101,“WanLin”,‘M’,19,87.5,“DaLian”};()例structstudent{intnum;charname[20];charsex;intage;floatscore;charaddr[30];}stu1,stu2;stu2=stu1;()例structstudent{intnum;charname[20];structdate{intmonth;intday;intyear;}birthday;}stu1,stu2;numnamebirthdaymonthdayyearstu1.birthday.month=12;例structstudent{intnum;charname[20];charsex;intage;floatscore;charaddr[30];}stu1,stu2;if(stu1==stu2)……..()形式二:struct結(jié)構(gòu)體名{
類型標(biāo)識(shí)符成員名;類型標(biāo)識(shí)符成員名;
…………….}結(jié)構(gòu)體變量={初始數(shù)據(jù)};例structstudent{intnum;charname[20];charsex;intage;charaddr[30];}stu1={112,“WangLin”,‘M’,19,“200BeijingRoad”};形式三:struct{
類型標(biāo)識(shí)符成員名;類型標(biāo)識(shí)符成員名;
…………….}結(jié)構(gòu)體變量={初始數(shù)據(jù)};例struct{intnum;charname[20];charsex;intage;charaddr[30];}stu1={112,“WangLin”,‘M’,19,“200BeijingRoad”};11.5結(jié)構(gòu)體數(shù)組結(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]25B例統(tǒng)計(jì)候選人選票structperson{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);}namecountLiZhangWang000structdata{inta,b,c;};main(){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:30arga:27b:3c:30(main)(func)parma:18b:5c:90arga:27b:3c:30(main)arga:27b:3c:30(main)例用結(jié)構(gòu)體變量作函數(shù)參數(shù)鏈表
C語言中,變量存儲(chǔ)空間的分配分為靜態(tài)分配和動(dòng)態(tài)分配。靜態(tài)存儲(chǔ)分配:先在程序說明部分進(jìn)行變量的說明,然后在程序編譯時(shí)分配適當(dāng)?shù)拇鎯?chǔ)單元。這些存儲(chǔ)單元一經(jīng)分配,在它的生存期內(nèi)是固定不變的。動(dòng)態(tài)存儲(chǔ)分配:在程序執(zhí)行期間,通過“申請(qǐng)”分配指定的存儲(chǔ)空間來存儲(chǔ)數(shù)據(jù),當(dāng)有閑置不用的存儲(chǔ)空間時(shí),又可以隨時(shí)將其釋放。2.鏈表存儲(chǔ)結(jié)構(gòu)是一種動(dòng)態(tài)數(shù)據(jù)結(jié)構(gòu)特點(diǎn):(1)它包含的數(shù)據(jù)對(duì)象的個(gè)數(shù)及其相互關(guān)系可以按需要改變.(2)存儲(chǔ)空間是程序根據(jù)需要在程序運(yùn)行過程中向系統(tǒng)申請(qǐng)獲得.(3)不要求邏輯上相鄰的元素在物理位置上也相鄰.(4)沒有順序存儲(chǔ)結(jié)構(gòu)所具有的弱點(diǎn).單向鏈表的邏輯狀態(tài)QianSunLiZhouWuWangHead7131432537以上鏈表結(jié)構(gòu)中只有一個(gè)方向的指針,因此又稱為單鏈表,簡(jiǎn)稱為鏈表。一般地,用戶可根據(jù)鏈表存放的信息如存放學(xué)生信息就稱為學(xué)生鏈表,存放職工信息就稱為職工鏈表。在單鏈表,通常稱它的數(shù)據(jù)元素為結(jié)點(diǎn),每個(gè)結(jié)點(diǎn)都是一個(gè)結(jié)構(gòu)體,至少包括兩個(gè)成員:存儲(chǔ)數(shù)據(jù)元素信息的成員稱為數(shù)據(jù)域;存儲(chǔ)直接后繼結(jié)點(diǎn)存儲(chǔ)位置的成員稱為指針域.顯然,鏈表結(jié)點(diǎn)的指針域存放的地址類型與它自身的類型是相同的。這就是C語言中較為特殊的遞歸結(jié)構(gòu)體或自引用結(jié)構(gòu)體,這種結(jié)構(gòu)體是指向自身結(jié)構(gòu)體的指針。數(shù)據(jù)元素之間的邏輯關(guān)系是由結(jié)點(diǎn)中的指針指示的,邏輯上相鄰的兩個(gè)數(shù)據(jù)元素其存儲(chǔ)的物理位置不要求緊鄰,即鏈表中的數(shù)據(jù)元素在內(nèi)存中不是順序存放的,要訪問其數(shù)據(jù)元素不能像數(shù)組一樣按下標(biāo)去查找。要找一個(gè)元素,必須先找到上一個(gè)元素,根據(jù)上一個(gè)元素的指針域才能找到下一個(gè)元素。因此,鏈表的數(shù)據(jù)元素訪問必須從頭指針開始,逐個(gè)訪問鏈表的每個(gè)結(jié)點(diǎn),直到元素的指針域?yàn)榭諡橹?。要使用鏈表,首先?yīng)定義結(jié)點(diǎn)的類型,再定義相應(yīng)的結(jié)構(gòu)體變量。例如,前面鏈表中結(jié)點(diǎn)的結(jié)構(gòu)類型可以定義為:
structstudent{charname[10];structstudent*next;};其中,next為指針變量,其類型為結(jié)構(gòu)體類型student,它可存儲(chǔ)一個(gè)student結(jié)構(gòu)體類型變量的地址,即實(shí)現(xiàn)鏈表中指向下一個(gè)結(jié)點(diǎn)的指針域。這是一個(gè)遞歸定義,它在結(jié)構(gòu)體student的定義未完成時(shí)又引用它定義其它的變量(指針變量)。引入鏈表后,用戶就可以根據(jù)需要在程序的運(yùn)行過程中動(dòng)態(tài)分配存儲(chǔ)空間。動(dòng)態(tài)存儲(chǔ)分配需要利用以下C語言庫函數(shù)。(1)函數(shù)malloc函數(shù)功能:函數(shù)原型:void*malloc(unsignedintsize);在內(nèi)存的動(dòng)態(tài)存儲(chǔ)區(qū)中分配一個(gè)長度為size的連續(xù)存儲(chǔ)空間。其中,形參size為無符號(hào)整數(shù),是函數(shù)malloc要求分配存儲(chǔ)空間的字節(jié)個(gè)數(shù)。函數(shù)返回值為一個(gè)指針,它指向所分配存儲(chǔ)空間的起始地址。若函數(shù)返回值為0,則表示未能成功申請(qǐng)到內(nèi)存空間。函數(shù)類型為void,表示返回的指針不指向任何具體的類型.(2)函數(shù)calloc函數(shù)原型:voidcalloc(unsignedintn,unsignedintsize);函數(shù)功能:在內(nèi)存的動(dòng)態(tài)存儲(chǔ)區(qū)域中分配n個(gè)長度為size的連續(xù)存儲(chǔ)空間。函數(shù)的返回值為分配域的起始地址;如果分配不成功,則返回值為0。例如:int*p;p=(int*)calloc(3,8);分配3個(gè)8字節(jié)的的連續(xù)存儲(chǔ)空間,并將其起始地址賦給整型指針p。(3)函數(shù)free函數(shù)原型:voidfree(void*ptr);函數(shù)功能:釋放由指針變量ptr為所指示的內(nèi)存區(qū)域。其中,ptr一個(gè)指針變量,指向最近一次調(diào)用函數(shù)malloc或calloc時(shí)所分配的連續(xù)存儲(chǔ)空間的首地址。通過函數(shù)free將已分配的內(nèi)存區(qū)域交還系統(tǒng),使系統(tǒng)可以重新對(duì)其進(jìn)行分配。例如:long*p;p=(long*)malloc(8);...free(p);Structstu*creat(){structstu*head;Structstu*last,*p;Intnum;Charname[20];Floatscore;Head=last=NULL;Printf(“pleaseinputnumnamescore:\n”);Scanf(“%d%s%f”,&num,name,&score);While(num>0){p=(structstu*)malloc(sizeof(structstu));pnum=num;strcpy(pname,name);pscore=score;pnext=NULL;if(head==NULL)head=p;elselastnext=p;last=p;scanf(“%d%s%f”,&num,name.&score);}Return(head);}Structstu{Intnum;Charname[20];Floatscore;Structstu*next;}headlastphead1wang85.0NULLlasthead1wang85.0last2liu63.5NULLp11.8聯(lián)合體用途:使幾個(gè)不同類型的變量共占一段內(nèi)存(相互覆蓋)聯(lián)合體類型定義定義形式:union聯(lián)合體名{
類型標(biāo)識(shí)符成員名;類型標(biāo)識(shí)符成員名;…………….};例uniondata{inti;charch;floatf;};類型定義不分配內(nèi)存2000200120022003chif形式一:uniondata{inti;charch;floatf;}a,b;形式二:uniondata{inti;charch;floatf;};uniondataa,b,c,*p,d[3];形式三:union{inti;charch;floatf;}a,b,c;聯(lián)合體變量的定義fchifchiab聯(lián)合體變量定義分配內(nèi)存,長度=最長成員所占字節(jié)數(shù)聯(lián)合體變量任何時(shí)刻只有一個(gè)成員存在聯(lián)合體變量引用引用方式:例a.i=1;a.ch=‘a(chǎn)’;a.f=1.5;printf(“%d”,a.i);(編譯通過,運(yùn)行結(jié)果不對(duì))
引用規(guī)則不能引用聯(lián)合體變量,只能引用其成員聯(lián)合體指針名->成員名聯(lián)合體變量名.成員名(*聯(lián)合體指針名).成員名uniondata{inti;charch;floatf;};uniondataa,b,c,*p,d[3];a.ia.cha.fp->ip->chp->f(*p).i(*p).ch(*p).fd[0].id[0].chd[0].f聯(lián)合體變量中起作用的成員是最后一次存放的成員例union{inti;charch;floatf;}a;a=1;()
不能在定義聯(lián)合體變量時(shí)初始化例union{inti;charch;floatf;}a={1,’a’,1.5};()
可以用一個(gè)聯(lián)合體變量為另一個(gè)變量賦值例floatx;union{inti;charch;floatf;}a,b;a.i=1;a.ch=‘a(chǎn)’;a.f=1.5;b=a;()x=a.f;()例將一個(gè)整數(shù)按字節(jié)輸出0110000101000001低字節(jié)高字節(jié)ch[0]ch[1]運(yùn)行結(jié)果:i=60501ch0=101,ch1=141ch0=A,ch1=amain(){unionint_char{inti;charch[2];}x;x.i=24897;printf("i=%o\n",x.i);printf("ch0=%o,ch1=%o\nch0=%c,ch1=%c\n", x.ch[0],x.ch[1],x.ch[0],x.ch[1]);}枚舉類型所謂枚舉,是將具有相同屬性的一類數(shù)據(jù)值一一列舉。一.枚舉類型的定義1.enum枚舉類型名{標(biāo)識(shí)符1,標(biāo)識(shí)符2,…,標(biāo)識(shí)符n};★enum是枚舉類型定義的關(guān)鍵字★枚舉類型名是用戶命名的標(biāo)識(shí)符,它與enum構(gòu)成枚舉類型的標(biāo)識(shí)符★花括號(hào)中“標(biāo)識(shí)符1,標(biāo)識(shí)符2,…,標(biāo)識(shí)符n”是所定義枚舉類型的全部取值,通常稱這些標(biāo)識(shí)符為“枚舉元素“或“枚舉常量”。這些標(biāo)識(shí)符是用戶定義的標(biāo)識(shí)符,一般是所代表事物的名稱,但這些標(biāo)識(shí)符并不自動(dòng)地代表事物本身。例如enumcolor{red,blue,green,black};用戶可根據(jù)需要在定義時(shí)直接指定某一枚舉元素的編號(hào),從而改變量系統(tǒng)默認(rèn)的編號(hào)。例如:enumweek{sun=7,mon,tue=2,wed,thu,fri,sat};則sun的序號(hào)為7,mon的序號(hào)為8,tue的序號(hào)為2,wed的序號(hào)為3,thu的序號(hào)為4,fri的序號(hào)為5,sat的序號(hào)為6。2.枚舉類型是有序類型一般地,枚舉類型中各枚舉元素按定義時(shí)的先后次序分別編號(hào)為0、1、2、...、n-1。例如:red<blue值為真,各枚舉元素可根據(jù)其序號(hào)進(jìn)行大小比較和相應(yīng)的運(yùn)算green-red值為2二.枚舉類型的應(yīng)用1.枚舉類型變量的定義
enum{male,female}sex1,sex2;◆先定義枚舉類型,再定義枚舉類型變量enumweek{sun,mon,tue,wed,thu,fri,sat};enumweekweekday,workday;◆定義枚舉類型的同時(shí)定義枚舉變量enumcolor{red,blue,green,black}a,b,c;◆直接定義枚舉變量
例:編寫程序,輸入今天是星期幾,計(jì)算并輸出明天是星期幾Enumweek{sun,mon,tur,wed,thu,fri,sat}Enumweektomorrow(day)Enumday;{intn;n=((int)day+1)%7;Return((enumweek)n);}Main(){enumweekday1,day2;Char*name[]={“sum”,”mon”,”tur”,”wed”,”fri”,”sat”};Intn;Pri
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 珠寶店員工勞動(dòng)合同
- 工程合同的管理流程包括
- 服裝店長聘用合同范本
- 二零二五年度高校多媒體報(bào)告廳設(shè)施更新與維護(hù)管理協(xié)議3篇
- 二零二五年度高層建筑消防設(shè)施維護(hù)保養(yǎng)人工費(fèi)承包合同模板3篇
- 合作合同范本
- 公司集資房屋買賣合同協(xié)議書
- 股份代持協(xié)議書模板
- 2025年上半年山東濟(jì)陽縣事業(yè)單位招考129名工作人員易考易錯(cuò)模擬試題(共500題)試卷后附參考答案
- 2025年上半年山東沂蒙建工集團(tuán)限公司公開長期招聘造價(jià)師16人易考易錯(cuò)模擬試題(共500題)試卷后附參考答案
- 通信電子線路(哈爾濱工程大學(xué))智慧樹知到課后章節(jié)答案2023年下哈爾濱工程大學(xué)
- 《公路勘測(cè)細(xì)則》(C10-2007 )【可編輯】
- 皮膚惡性黑色素瘤-疾病研究白皮書
- 從心理學(xué)看現(xiàn)代家庭教育課件
- C語言程序設(shè)計(jì)PPT(第7版)高職完整全套教學(xué)課件
- 頭頸外科臨床診療指南2021版
- 大國重器北斗系統(tǒng)
- 網(wǎng)球運(yùn)動(dòng)知識(shí)教育PPT模板
- 防火墻漏洞掃描基礎(chǔ)知識(shí)
- 運(yùn)動(dòng)技能學(xué)習(xí)PPT
- 軟件風(fēng)險(xiǎn)分析報(bào)告
評(píng)論
0/150
提交評(píng)論