版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、(中職)C語言程序設(shè)計模塊九課件結(jié)構(gòu)體與聯(lián)合體模塊99.1結(jié)構(gòu)體(變量)的定義與說明9.1.1結(jié)構(gòu)體的定義結(jié)構(gòu)體使用struct關(guān)鍵字進(jìn)行定義。struct 結(jié)構(gòu)體名數(shù)據(jù)類型 成員名1;數(shù)據(jù)類型 成員名2;數(shù)據(jù)類型 成員名n; ;/*注意別丟了分號*/例如,定義一個名為student的結(jié)構(gòu)體:struct studentchar name8;char sex;char nation10;int age;float score;9.1結(jié)構(gòu)體(變量)的定義與說明9.1.2結(jié)構(gòu)體變量的定義與賦值(1)先定義結(jié)構(gòu),后定義變量。struct studentchar name8;char sex;char
2、 nation10;int age;float score;struct student x,y;/*這里定義了x,y兩個結(jié)構(gòu)體變量*/(2)結(jié)構(gòu)體和結(jié)構(gòu)體變量同時定義。struct studentchar name8;char sex;char nation10;int age;float score;x,y;/*這里同時定義了x,y兩個結(jié)構(gòu)體變量*/1.結(jié)構(gòu)體變量的定義方法9.1結(jié)構(gòu)體(變量)的定義與說明9.1.2結(jié)構(gòu)體變量的定義與賦值定義時可以省略結(jié)構(gòu)體名。struct char name8;char sex;char nation10;int age;float score;x,y;/
3、*這里同時定義了x,y兩個結(jié)構(gòu)體變量*/不建議省略結(jié)構(gòu)體名。一個明晰的結(jié)構(gòu)體名可以幫我們直觀地了解到本結(jié)構(gòu)體是針對哪個方面的數(shù)據(jù)構(gòu)造類型。9.1結(jié)構(gòu)體(變量)的定義與說明9.1.2結(jié)構(gòu)體變量的定義與賦值(3)結(jié)構(gòu)體的嵌套定義。所謂結(jié)構(gòu)體的嵌套定義指的是一個結(jié)構(gòu)體的變量做另一個結(jié)構(gòu)體的成員。例如:struct dateint year;int month;int day;struct studentchar name20;char sex;char nation10;int age;struct date birthday; /*這里就是date結(jié)構(gòu)體變量birthday做student的成員*
4、/ x ;9.1結(jié)構(gòu)體(變量)的定義與說明9.1.2結(jié)構(gòu)體變量的定義與賦值2.結(jié)構(gòu)體變量的賦值給結(jié)構(gòu)體變量賦值,實(shí)質(zhì)是給各個成員進(jìn)行賦值,見表9-1。例如:struct studentchar name20;char sex;char nation10;int age;float score;x=Lixiaomei,f,dongze,18,456;表9-1給結(jié)構(gòu)體變量賦值給結(jié)構(gòu)體變量賦值時,要以成員順序為依據(jù)按序賦值,用 括起來。9.1結(jié)構(gòu)體(變量)的定義與說明9.1.3結(jié)構(gòu)體變量的使用結(jié)構(gòu)體變量的使用實(shí)質(zhì)是結(jié)構(gòu)體成員的引用,即其單個成員的運(yùn)算操作(如賦值、輸入/輸出等)。結(jié)構(gòu)體成員的引用方法
5、是:結(jié)構(gòu)體變量名.成員名其中,“.”為成員運(yùn)算符。成員運(yùn)算符“.”、成員指向運(yùn)算符“-”、變址符“ ”和括號“()”運(yùn)算符在C語言中具有最高的運(yùn)算級別。9.1結(jié)構(gòu)體(變量)的定義與說明9.1.3結(jié)構(gòu)體變量的使用【例9-1】對結(jié)構(gòu)體變量進(jìn)行動態(tài)賦值。#include #include struct dateint year;int month;int day;struct studentchar name20;char sex;char nation10;int age;float score;struct date birthday; y=zhangjie,m,don,18,340; /*注意
6、birthday沒有賦值*/int main();struct student x,z; /*下面對結(jié)構(gòu)體變量x各成員進(jìn)行賦值*/strcpy(,Lily);/*不能寫成=Lily,因為name數(shù)組名是地址常量 */x.sex=f;strcpy(x.nation,dongzi);x.age=18;x.score=428;9.1結(jié)構(gòu)體(變量)的定義與說明9.1.3結(jié)構(gòu)體變量的使用x.birthday.year=1999; /*嵌套定義時須用成員運(yùn)算符一級一級地找到最底層一級成員*/x.birthday.month=5;x.birthday.day=23;/*具有相同結(jié)構(gòu)的
7、結(jié)構(gòu)體變量可以進(jìn)行相互賦值*/y=x;/*變量x的各成員值賦給了變量y的各成員*/*也可進(jìn)行結(jié)構(gòu)體變量單個成員的相互賦值*/z.nation=x.nation;z.sex=y.sex;printf(%s,%c,%s,%d,%.1f,,x.sex,x.nation,x.age,x.score);printf(%d-%d-%d,x.birthday.year,x.birthday.month,x.birthday.day);9.1結(jié)構(gòu)體(變量)的定義與說明9.1.4結(jié)構(gòu)體變量的內(nèi)存長度計算結(jié)構(gòu)體是一種構(gòu)造數(shù)據(jù)類型,定義時系統(tǒng)并不分配內(nèi)存空間,但結(jié)構(gòu)體變量則是會分配內(nèi)存空間的。那么,系統(tǒng)
8、是如何給結(jié)構(gòu)體變量分配內(nèi)存空間的呢?在程序運(yùn)行中,結(jié)構(gòu)體變量各成員是同時存在于內(nèi)存中的,因而結(jié)構(gòu)體變量的內(nèi)存長度是各成員的長度之和。例如:char nation10;int age;float score;struct date birthday; x;struct dateint year;int month;int day;struct studentchar name20;char sex;9.1結(jié)構(gòu)體(變量)的定義與說明9.1.4結(jié)構(gòu)體變量的內(nèi)存長度計算結(jié)構(gòu)體變量x的內(nèi)存長度計算如下:(1)成員char name20,長度為20 B;(2)成員char sex,長度為1 B;(3)成員
9、char nation10,長度為10 B;(4)成員age,長度為2 B;(5)成員score,長度為4 B;(6)成員birthday,長度為2 B(year)+2 B(month)+2 B(day)=6 B。故x的內(nèi)存長度為20 B+1 B+10 B+2 B+4 B+6 B=43 B。9.2結(jié)構(gòu)體數(shù)組9.2.1結(jié)構(gòu)體數(shù)組的定義與賦值示例:struct studentchar name20;char sex;char nation10;int age;float score;stu15=Tangwei,m,hang,18,524,wuyan,f,dong,19,543;struct stu
10、dent stu25;(1)示例中定義了兩個結(jié)構(gòu)體數(shù)組,其中數(shù)組stu1初始化了兩個元素。(2)要注意給結(jié)構(gòu)體數(shù)組初始化或給元素賦值時,因為每個元素又是結(jié)構(gòu)體類型的變量,因此各元素的初值列表也要用 括起來。9.2結(jié)構(gòu)體數(shù)組9.2.2結(jié)構(gòu)體數(shù)組長度的計算示例:struct studentchar name20;char sex;char nation10;int age;float score;stu15;結(jié)構(gòu)體數(shù)組長度的計算方法是:(1)每個數(shù)組元素的長度是:20+1+10+2+437 B。(2)共有5個元素,故該數(shù)組長度為:537=185 B。9.2結(jié)構(gòu)體數(shù)組9.2.3結(jié)構(gòu)體數(shù)組元素的引用結(jié)
11、構(gòu)體數(shù)組元素的引用同樣必須用成員運(yùn)算符帶成員名的格式:結(jié)構(gòu)體數(shù)組名下標(biāo).成員名【例9-2】定義一個名為student的結(jié)構(gòu)體,該結(jié)構(gòu)體包含姓名和成績兩個成員。定義一個含5個元素的結(jié)構(gòu)體數(shù)組stu,輸出5個同學(xué)的姓名和成績。輸入完畢自動計算出每位同學(xué)的總分和平均分。#include struct studentchar name20;int score3;stu5;int main()int i,j;int sum;printf(Please input the other students infomation:n);for(i=0;i5;i+)9.2結(jié)構(gòu)體數(shù)組9.2.3結(jié)構(gòu)體數(shù)組元素的引用p
12、rintf(Input name:);scanf(%s,); /*數(shù)組元素的引用:輸入姓名*/printf(Input %ss 3 score:,);for(j=0;j3;j+)scanf(%d,&stui.scorej); /*數(shù)組元素的引用:輸入每個同學(xué)的3科成績*/for(i=0;i5;i+)sum=0;for(j=0;j3;j+)sum+=stui.scorej; /*數(shù)組元素的引用:統(tǒng)計出每個同學(xué)的3科總分*/printf(%ss total score is:%d,Average is %dn,,sum,sum/3);9.2結(jié)構(gòu)
13、體數(shù)組9.2.3結(jié)構(gòu)體數(shù)組元素的引用要注意的是:(1)成員中若有float/double型成員,有的編譯環(huán)境(如TC)沒有關(guān)于浮點(diǎn)數(shù)的運(yùn)算,在鏈接時不會鏈接上浮點(diǎn)鏈接庫,因而會出現(xiàn)編譯成功但無法使用的情況。一個簡單的解決方法是:調(diào)用數(shù)學(xué)頭文件“math.h”,并在主函數(shù)main()的第1行加一個關(guān)于浮點(diǎn)數(shù)運(yùn)算的表達(dá)式,最好帶一個庫函數(shù),如sqrt()。這樣,編譯時就可鏈接上浮點(diǎn)鏈接庫了。(2)在for循環(huán)輸入中,若成員中有char 字符變量成員,不要以單字符格式“%c”輸入,因為無結(jié)尾符0,循環(huán)輸入時編譯環(huán)境會忽視其操作。應(yīng)以“%s”進(jìn)行輸入,因為字符串系統(tǒng)會自動加0。9.2結(jié)構(gòu)體數(shù)組9.2.
14、3結(jié)構(gòu)體數(shù)組元素的引用#include #include struct studentchar name20;int class;char sex6;float score3;/*3科成績,浮點(diǎn)型*/stu2;int main()float x=sqrt(1); /*浮點(diǎn)數(shù)運(yùn)算表達(dá)式,目的是鏈接上浮點(diǎn)鏈接庫*/int i,j;float sum;printf(Please input the other students information:n);for(i=0;i2;i+)printf(Input name:);scanf(%s,);9.2結(jié)構(gòu)體數(shù)組9.2.3結(jié)構(gòu)體數(shù)組
15、元素的引用printf(Input class:);scanf(%d,&stui.class);printf(Input sex:);scanf(%s,stui.sex);printf(Input %ss 3 score:,);for(j=0;j3;j+)scanf(%f,&stui.scorej);putchar(n);for(i=0;i2;i+)sum=0;for(j=0;j3;j+)sum+=stui.scorej;printf(Name:%s Class:%d Sex:%s Total:%.1f Average:%.1fn,,stui.class,s
16、tui.sex,sum,sum/3);9.2結(jié)構(gòu)體數(shù)組9.2.3結(jié)構(gòu)體數(shù)組元素的引用【例9-3】投票統(tǒng)計。某班進(jìn)行班長投票選舉,班長一職將在李陽、趙明和吳莉3位同學(xué)中產(chǎn)生。該班共45位同學(xué),李、趙、吳3位同學(xué)不能參加投票。下面利用結(jié)構(gòu)體數(shù)據(jù)類型進(jìn)行投票,共投42次,輸出每個人的票數(shù)。注意,只能在這3位同學(xué)中產(chǎn)生,投票錯誤無效,必須重新投票(為方便查看效果,程序模擬僅投10次)。9.2結(jié)構(gòu)體數(shù)組9.2.3結(jié)構(gòu)體數(shù)組元素的引用#include struct leaderchar name20;int num;int main() struct leader xx3=Liyang,0,Zhaomin
17、g,0,Wuli,0;int i,j;char xm20;printf(Begin to cast:n);for(i=0;i10;i+)printf(Please cast NO.%d vote:,i+1);scanf(%s,xm);if(strcmp(Liyang,xm)!=0&strcmp(Zhaoming,xm)!=0&strcmp(Wuli,xm)!=0)9.2結(jié)構(gòu)體數(shù)組9.2.3結(jié)構(gòu)體數(shù)組元素的引用while(1)printf(Error!Please cast again:);scanf(%s,xm);if(strcmp(Liyang,xm)=0|strcmp(Zhaoming,x
18、m)=0|strcmp(Wuli,xm)=0)break;for(j=0;j3;j+)if(strcmp(,xm)=0) xxj.num+;break;for(i=0;iname”,故“strcpy(,Wujie);”等價于“strcpy(*p).name,Wujie);”和“strcpy(p-name,Wujie);”。下面同理:(2)“x.sex=m”等價于“(*p).sex=m”和“p-sex=m”。(3)“x.age=15”等價于 “(*p).age=15”和“p-age=15”。(4)“x.score=623”等價于“(*p).score=623”和“p-
19、score=623”。9.3結(jié)構(gòu)體指針9.3.2結(jié)構(gòu)體指針的運(yùn)用同樣以模塊9.3.1中定義的結(jié)構(gòu)體數(shù)組stu和結(jié)構(gòu)體數(shù)組指針p1為例。我們知道,數(shù)組名為首元素(0號元素)首地址,因為“struct student *p1=stu;”,故結(jié)構(gòu)體數(shù)組指針p1也指向該結(jié)構(gòu)體數(shù)組首元素首地址(注意不是結(jié)構(gòu)體成員地址)。而p1+則指向下一元素(1號元素)的首地址,以此類推。(1)“”等價于“(*p1).name”和“p1-name”,故“strcpy(,Jack);”等價于“strcpy(*p1).name,Jack);”和“strcpy(p1-name,Jack)”
20、。2.結(jié)構(gòu)體數(shù)組指針在元素引用時的使用9.3結(jié)構(gòu)體指針9.3.2結(jié)構(gòu)體指針的運(yùn)用下面同理:(2)“stu1.age=16”等價于“*(p1+1).age=16”和“(p1+1)-age=16”。(3)“stu2.score=598”等價于“*(p1+2).score=598”和“(p1+2)-score=598”。因此,若要輸出9.3.1中結(jié)構(gòu)體數(shù)組各元素的成員值,可以使用for循環(huán)語句:for(p1=stu,p1name,p1-sex,p1-age,p1-score);結(jié)構(gòu)體數(shù)組指針指向各元素首地址如圖9-1所示,要清楚這個首地址并非元素成員的地址。圖9-1結(jié)構(gòu)體數(shù)組指針指向各元素首地址9.
21、3結(jié)構(gòu)體指針9.3.2結(jié)構(gòu)體指針的運(yùn)用【例9-4】三種模式輸出示例。#include struct studentchar name8;char sex;int age;float score;struct student x=Wujie,m,15,623;struct student stu3=Jack,m,17,612,Tom,m,16,645,Lucy,f,18,598;struct student *p=&x;struct student *p1=stu;int main()9.3結(jié)構(gòu)體指針9.3.2結(jié)構(gòu)體指針的運(yùn)用printf(%s-%s-%sn,(*p).name,p-name,x
22、.name);printf(%s-%s-%sn,(*p1).name,p1-name,);printf(%d-%d-%dn,(*(p1+1).age,(p1+1)-age,stu1.age);printf(%.0f-%.0f-%.0fn,(*(p1+2).score,(p1+2)-score,stu2.score);printf(%sn,strcpy(p-name,Jack);printf(%.0f-%.0f-%.0fn,(*p1).score,(p1+1)-score,(p1+2)-score);for(p1=stu;p1name,p1-sex,p1-age,p1-scor
23、e);9.4結(jié)構(gòu)體與函數(shù)9.4.1以結(jié)構(gòu)體成員做實(shí)參進(jìn)行值傳遞結(jié)構(gòu)體多個成員做實(shí)參進(jìn)行值傳遞。以下程序功能是:輸入3個學(xué)生的姓名和其4科成績,計算其總分。#include struct studentchar name8;int score4;int total;stu3,*p=stu;int add(int a,int b,int c,int d);int main() int i,j;for(i=0;i3;i+) printf(Input NO.%d students names and 4 score:n,i+1);9.4結(jié)構(gòu)體與函數(shù)9.4.1以結(jié)構(gòu)體成員做實(shí)參進(jìn)行值傳遞scanf(%s
24、,);for(j=0;j4;j+)scanf(%d,&stui.scorej);printf(Output 3 students score:n);for(i=0;i3;i+)/*下面是結(jié)構(gòu)體成員做實(shí)參進(jìn)行值傳遞*/stui.total=add(stui.score0,stui.score1,stui.score2,stui.score3);printf(Name:%ss total=%dn,,stui.total);int add(int a,int b,int c,int d)return a+b+c+d; 很明顯,多個實(shí)參進(jìn)行值傳遞,系統(tǒng)必須開辟多個存
25、儲單元,效率是低下的。在函數(shù)調(diào)用中提高工作效率的參數(shù)傳遞方式莫過于地址傳遞,形實(shí)參指向同一個存儲單元,可想而知,相對于值傳遞來說,效率是翻倍的。9.4結(jié)構(gòu)體與函數(shù)9.4.2以結(jié)構(gòu)體指針做實(shí)參進(jìn)行地址傳遞結(jié)構(gòu)體指針做實(shí)參傳遞,大大提高運(yùn)算效率。以下程序的功能是輸入3個學(xué)生的姓名和其4科成績,計算并輸出每個學(xué)生的總分和平均分。同時,判斷成績,總分大于等于320,輸出“Excellent”,小于320大于等于240,輸出“pass”,其他輸出“Fail”,最后對總分用冒泡法進(jìn)行降序排序。#include #include struct studentchar name8;float score4;
26、/*每個學(xué)生有4科成績*/float total;float average;stu3,*p=stu; /*結(jié)構(gòu)體指針p指向結(jié)構(gòu)體數(shù)組*/int main()float x=sqrt(1);/* 用于鏈接到浮點(diǎn)鏈接庫*/9.4結(jié)構(gòu)體與函數(shù)9.4.2以結(jié)構(gòu)體指針做實(shí)參進(jìn)行地址傳遞void add(struct student *p1); /*函數(shù)調(diào)用在函數(shù)定義之前,必須先對函數(shù)做聲明。該函數(shù)聲明的形參為結(jié)構(gòu)體指針。聲明在main()函數(shù)中,只能為main()函數(shù)調(diào)用*/add(p); /*調(diào)用時以結(jié)構(gòu)體指針p作為實(shí)參*/void add(struct student *p1)/*定義add函數(shù)*
27、/int i,j,t;printf(Input 3 students name and 4 score:n);for(i=0;i3;i+)/*循環(huán)輸入3個學(xué)生的姓名和每個學(xué)生的4科成績*/scanf(%s,);for(j=0;j4;j+)scanf(%f,&stui.scorej);printf(Output 3 students score:n);for(p1=stu;p1total=0;for(i=0;itotal+=p1-scorei;/*每個學(xué)生的總分計算*/p1-average=p1-total/4; /*每個學(xué)生的平均分計算*/printf(Name:%s Tot
28、al=%.1f average=%.2f-,p1-name,p1-total,p1-average);/*下面進(jìn)行成績判斷*/if(p1-total=320)printf(Excellent);else if(p1-total=240&p1-total320)printf(pass);elseprintf(Fail);putchar(n); /*每一次外循環(huán)完畢,換一行*/9.4結(jié)構(gòu)體與函數(shù)9.4.2以結(jié)構(gòu)體指針做實(shí)參進(jìn)行地址傳遞/*用冒泡法對總分進(jìn)行從大到小的排序,一般用數(shù)組的方式*/for(j=0;j2;j+)for(i=0;i2-j;i+)if(stui.totalstui+1.tota
29、l)t=stui.total;stui.total=stui+1.total;stui+1.total=t;for(i=0;i3;i+)/*從高到低輸出總分*/printf(%.1f,stui.total);9.5typedef、malloc的使用在C語言中,typedef是類型別名定義符,它定義一個類型的別名,然后就可以通過這個別名來定義其他同類型的變量。在結(jié)構(gòu)體中,typedef尤其有用,可以為用戶減少不少的工作量;malloc函數(shù)在“堆棧”一節(jié)有簡述,它是動態(tài)獲?。ǚ峙洌﹥?nèi)存空間的函數(shù),它包含于malloc.h、stdlib.h等頭文件中,所申請的空間用完后用free()函數(shù)來釋放。9.
30、5typedef、malloc的使用9.5.1typedef的用法先來看一個例子:“char *p;”定義了一個字符指針p;“typedef char *PCHAR;”定義了一個字符類型指針別名PCHAR;“PCHAR p1,p2;”定義了2個字符指針p1,p2。這個例子清楚地表明了typedef 作為類型別名定義符的功能。要指出的是:別名一般要用大寫字符,以區(qū)別于變量一般用小寫字符的寫法。9.5typedef、malloc的使用9.5.1typedef的用法在結(jié)構(gòu)體中,如:typedef struct student char xm10;int age;int class;float sco
31、re;STUD;/*這里定義了一個結(jié)構(gòu)體類別名STUD*/STUD *p;/*用這個類別名定義了一個結(jié)構(gòu)體指針,等同于“struct student *p;”*/STUD x;/*用這個類別名定義了一個結(jié)構(gòu)體變量,等同于“struct student x;”*/9.5typedef、malloc的使用9.5.1typedef的用法1.malloc申請內(nèi)存空間的方法(返回的指針類型)malloc(指定的長度(字節(jié)數(shù))示例1:typedef struct student char xm10;int age;int class;float score;STUD;STUD *p;p=(STUD*)ma
32、lloc (sizeof(STUD);“p=(STUD*)malloc (sizeof(STUD);”意為:結(jié)構(gòu)體指針p指向動態(tài)分配的長度為(sizeof(STUD)的內(nèi)存塊,即18 B的內(nèi)存長度。它等同于:p=(struct student *)malloc(sizeof(struct student)9.5typedef、malloc的使用9.5.1typedef的用法示例2:接上面結(jié)構(gòu)體示例:“p=(struct student *)malloc(100);”意為:給p動態(tài)分配100 B的內(nèi)存空間。9.5typedef、malloc的使用9.5.1typedef的用法2.釋放malloc
33、動態(tài)申請的內(nèi)存空間方法:free(指針名);例如,malloc動態(tài)內(nèi)存申請與釋放:用malloc動態(tài)申請的內(nèi)存須用“free(指針名)”進(jìn)行釋放。例如:free(p);例如,malloc動態(tài)內(nèi)存申請與釋放:#include #include int main()typedef struct stuint num;char *name;char sex;int score;9.5typedef、malloc的使用9.5.1typedef的用法STU;STU *ps,*pt,*pu;ps=(STU*)malloc(sizeof(STU);/*三個指針動態(tài)分配長度不一的內(nèi)存空間*/pt=(STU*)
34、malloc(sizeof(double);pu=(STU*)malloc(100);ps-num=6;ps-name=Lucy;ps-sex=f;ps-score=100;pu=pt=ps; printf(NO.%d: Name:%s SEX:%c SCORE:%d,ps-num,ps-name,ps-sex,ps-score);putchar(n);printf(NO.%d: Name:%s SEX:%c SCORE:%d,pu-num,pu-name,pu-sex,pu-score);putchar(n);9.5typedef、malloc的使用9.5.1typedef的用法printf
35、(NO.%d: Name:%s SEX:%c SCORE:%d,pt-num,pt-name,pt-sex,pt-score);putchar(n);free(pu); /*釋放內(nèi)存后,內(nèi)存中不再保留原數(shù)據(jù)*/free(ps);free(pt);(1)如果malloc動態(tài)分配內(nèi)存成功,則返回指向被分配內(nèi)存的指針。(2)如果malloc動態(tài)分配內(nèi)存不成功,則返回空指針NULL。(3)malloc不能自動計算長度,需指定長度或由sizeof()計算。9.6聯(lián)合體(變量)的定義與說明9.6.1聯(lián)合體的定義聯(lián)合體使用union關(guān)鍵字進(jìn)行定義:union結(jié)構(gòu)體名數(shù)據(jù)類型成員名1;數(shù)據(jù)類型成員名2;數(shù)據(jù)類
36、型成員名n;/*注意別丟了分號*/例如,定義一個名為student的聯(lián)合體:union studentchar name8;char sex;char nation10;int age;float score;9.6聯(lián)合體(變量)的定義與說明9.6.2聯(lián)合體變量的定義1.先定義結(jié)構(gòu),后定義變量union studentchar name8;char sex;char nation10;int age;float score;union student x,y;/*這里定義了x,y兩個聯(lián)合體變量*/9.6聯(lián)合體(變量)的定義與說明9.6.2聯(lián)合體變量的定義2.聯(lián)合體和聯(lián)合體變量同時定義union
37、 studentchar name8;char sex;char nation10;int age;float score;x,y;/*這里同時定義了x,y兩個聯(lián)合體變量*/定義時可以省略聯(lián)合體名。union char name8;char sex;char nation10;int age;float score;x,y;/*這里同時定義了x,y兩個聯(lián)合體變量*/9.6聯(lián)合體(變量)的定義與說明9.6.3聯(lián)合體變量的使用及內(nèi)存長度的計算聯(lián)合體變量的使用實(shí)質(zhì)是聯(lián)合體成員的引用,即其某個成員的運(yùn)算操作(如賦值、輸入/輸出等)。聯(lián)合體成員的引用方法是:聯(lián)合體變量名.成員名(1)聯(lián)合體變量各成員共同
38、占用一段內(nèi)存。(2)內(nèi)存長度最長的成員就是該聯(lián)合體變量的內(nèi)存長度。(3)因為各成員共同占用一段內(nèi)存,因而:聯(lián)合體變量不能像結(jié)構(gòu)體變量那樣進(jìn)行初始化,只能在程序中進(jìn)行賦值。每次只能對聯(lián)合體變量某一成員進(jìn)行賦值,因此,一個聯(lián)合體變量的值就是聯(lián)合體變量的某一個成員的值。聯(lián)合體變量在運(yùn)行中任何時候只能有一個成員存在。例如,聯(lián)合體變量各成員共占一段內(nèi)存示意圖如圖9-2所示。9.6聯(lián)合體(變量)的定義與說明9.6.3聯(lián)合體變量的使用及內(nèi)存長度的計算圖9-2聯(lián)合體變量各成員共占一段內(nèi)存示意圖unionint i;char ch;float score; a,b,c;成員score的內(nèi)存長度就是結(jié)構(gòu)體變量a、
39、b、c的內(nèi)存長度,為4 B。任何時候只能有一個成員(ch、i或者score)存在。各成員不能初始化,只能在程序中進(jìn)行賦值。9.6聯(lián)合體(變量)的定義與說明9.6.3聯(lián)合體變量的使用及內(nèi)存長度的計算【例9-5】結(jié)構(gòu)體中的聯(lián)合體。下面為一個學(xué)生和教師共用的結(jié)構(gòu)體,學(xué)生和教師都有共同的結(jié)構(gòu)體變量成員:姓名、年齡和工作。學(xué)生和教師的不同之處是班級(學(xué)生)和部門(教師),這兩個就作為聯(lián)合體變量成員。程序的功能是:輸入人員的信息(結(jié)構(gòu)體),如果身份是學(xué)生,就輸入班級;如果身份是教師,就輸入部門(聯(lián)合體)。最后把輸入結(jié)果顯示出來。9.6聯(lián)合體(變量)的定義與說明9.6.3聯(lián)合體變量的使用及內(nèi)存長度的計算#i
40、nclude structchar name10;int age;char identy20;unionint class;char office10; depa;/*聯(lián)合體變量作為結(jié)構(gòu)體成員*/ body2;/*結(jié)構(gòu)體數(shù)組*/int main()int i;9.6聯(lián)合體(變量)的定義與說明9.6.3聯(lián)合體變量的使用及內(nèi)存長度的計算for(i=0;i2;i+)printf(Input name,age and identy :n);scanf(%s %d %s,,&bodyi.age,bodyi.identy);if(strcmp(bodyi.identy,student)
41、=0)/*注意字符串的比較要用strcmp函數(shù)*/ printf(Input class:);scanf(%d,&bodyi.depa.class);/*在程序中給聯(lián)合體成員賦值,只能給一個成員賦值,且只允許一個成員存在*/elseprintf(Input office:);scanf(%s,bodyi.depa.office); /*在程序中給聯(lián)合體成員賦值,只能給一個成員賦值,且只允許一個成員存在*/ 9.6聯(lián)合體(變量)的定義與說明9.6.3聯(lián)合體變量的使用及內(nèi)存長度的計算printf(nametagetidentytclass/officen);for(i=0;i2;i+)if(str
42、cmp(bodyi.identy,student)=0)printf(%st%dt%st%dn,,bodyi.age,bodyi.identy,bodyi.depa.class);elseprintf(%st%dt%st%sn,,bodyi.age,bodyi.identy,bodyi.depa.office);9.6聯(lián)合體(變量)的定義與說明9.6.3聯(lián)合體變量的使用及內(nèi)存長度的計算【例9-6】進(jìn)一步理解聯(lián)合體在程序中只允許一個成員存在。int main()unionunsigned int n;unsigned char c;u;/*聯(lián)合體變量*/u
43、.n=66 ; u.c=A; /*在程序中每次只能給一個成員賦值,因此第1個賦值無效*/printf(%c,u.n);/*內(nèi)存中只保留有A這個值,故輸出字符A*/9.6聯(lián)合體(變量)的定義與說明9.6.3聯(lián)合體變量的使用及內(nèi)存長度的計算【例9-7】聯(lián)合體中的結(jié)構(gòu)體。聯(lián)合體變量a有兩個成員,其中一個成員為結(jié)構(gòu)體變量u。就外層(聯(lián)合體)來說,在程序中只允許一個成員存在;就內(nèi)層來說(結(jié)構(gòu)體),結(jié)構(gòu)體各成員是同時存在的。union structint x;char y;float z; u; /*結(jié)構(gòu)體變量作為聯(lián)合體的一個成員*/int k; /*聯(lián)合體成員*/a; /*聯(lián)合體變量*/int main
44、()a.u.x=4; a.u.y=A; a.u.z=3.14;/*給結(jié)構(gòu)體各成員賦值,該賦值是存在的*/a.k=97;/*給聯(lián)合體成員k賦值,在共同的這一段內(nèi)存中,將取代結(jié)構(gòu)體中成員x的值*/9.6聯(lián)合體(變量)的定義與說明9.6.3聯(lián)合體變量的使用及內(nèi)存長度的計算printf(%dn,a.u.x); /*輸出97*/printf(%cn,a.u.y); /*輸出A*/printf(%fn,a.u.z); /*輸出3.140000*/共占一段內(nèi)存示意圖如圖9-3所示。圖9-3共占一段內(nèi)存示意圖聯(lián)合體同樣可以定義指針和數(shù)組,但是聯(lián)合體變量不能作為函數(shù)參數(shù),函數(shù)也不能返回指向聯(lián)合體的指針變量。9.
45、7枚舉9.7.1枚舉類型及枚舉變量的定義enum 枚舉名枚舉值表變量名;圖示如圖9-4所示。圖9-4枚舉變量的定義9.7枚舉9.7.1枚舉類型及枚舉變量的定義例如:enum weekdaySunday=0,Monday,Tuesday,Wednsday,Thursday,Friday,Saturdaya,b,c;(1)枚舉名為:weekday,注意標(biāo)識符之間只能用逗號“,”隔開,最后一個標(biāo)識符后省略逗號。(2)定義了3個枚舉變量:a、b、c。(3)標(biāo)識符為Sunday到Saturday,即星期天到星期六。(4)標(biāo)識符Sunday初始化為0,其后的標(biāo)識符都沒有初始化,則順次加1,即Monday值
46、為1,Tuesday值為2,以此類推。9.7枚舉9.7.2枚舉的具體規(guī)則(1)枚舉值表只能是整型常量,不能是變量,因此不能對枚舉值進(jìn)行任何賦值。例如:enumweekdaySunday,Monday,Tuesday,Wednsday,Thursday,Friday,Saturdaya,b,c; Sunday=0;/*這是錯誤的*/(2)枚舉元素由系統(tǒng)自定義,從0開始按序加1,即0,1,2,3,4,因而枚舉值表都是整型常量。(3)要注意枚舉值的變化情況。例如:enum bodya,b=2,c,d=9,e,f=-1,h,i;在上面的枚舉中:a的值為0。b=2,則c的值為3;d=9,則e的值為10;f=-1,則h,i的值為別為0,1,即當(dāng)枚舉中的某個成員賦值后,其后的成員按依次加1的規(guī)則確定其值。9.7枚舉9.7.2枚舉的具體規(guī)則(4)變量也可以單獨(dú)定義
溫馨提示
- 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 山西大學(xué)附屬中學(xué)2025屆數(shù)學(xué)高三上期末監(jiān)測試題含解析
- 江西省宜春市宜豐縣二中2025屆高一生物第一學(xué)期期末達(dá)標(biāo)測試試題含解析
- 2025屆湖南省岳陽市三校高三生物第一學(xué)期期末綜合測試試題含解析
- 重慶市康德卷2025屆高二上生物期末檢測模擬試題含解析
- 2025屆福建省福州市平潭縣新世紀(jì)學(xué)校生物高一第一學(xué)期期末學(xué)業(yè)質(zhì)量監(jiān)測試題含解析
- 2025屆安徽省三人行名校聯(lián)生物高三第一學(xué)期期末教學(xué)質(zhì)量檢測模擬試題含解析
- 派大星美術(shù)課件
- 2025屆云南省昆明市重點(diǎn)中學(xué)英語高三第一學(xué)期期末達(dá)標(biāo)檢測試題含解析
- 浙江省杭州市塘棲中學(xué)2025屆生物高一上期末綜合測試模擬試題含解析
- 安徽省阜陽市潁州區(qū)阜陽三中2025屆高二上數(shù)學(xué)期末經(jīng)典模擬試題含解析
- 分布式光伏電站質(zhì)量驗收及評定項目劃分表(分部分項)
- 彈性力學(xué)與有限元分析試題答案
- 輥道窯操作維修手冊
- 生產(chǎn)建設(shè)項目水土保持監(jiān)測記錄表
- 朗文2B-Chapter4-檢測卷1(共4頁)
- Y2系列電機(jī)外形及安裝尺寸
- 污泥濃縮機(jī)技術(shù)說明(招標(biāo)專用版本2)
- 貝伐珠單抗從基礎(chǔ)到臨床PPT課件
- 進(jìn)位制 公開課PPT課件
- 小學(xué)五年級上冊數(shù)學(xué)計算題
- 消防火災(zāi)報警系統(tǒng)聯(lián)動邏輯關(guān)系表[1]
評論
0/150
提交評論