中職C語(yǔ)言程序設(shè)計(jì)模塊九課件_第1頁(yè)
中職C語(yǔ)言程序設(shè)計(jì)模塊九課件_第2頁(yè)
中職C語(yǔ)言程序設(shè)計(jì)模塊九課件_第3頁(yè)
中職C語(yǔ)言程序設(shè)計(jì)模塊九課件_第4頁(yè)
中職C語(yǔ)言程序設(shè)計(jì)模塊九課件_第5頁(yè)
已閱讀5頁(yè),還剩57頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、(中職)C語(yǔ)言程序設(shè)計(jì)模塊九課件結(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; ;/*注意別丟了分號(hào)*/例如,定義一個(gè)名為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兩個(gè)結(jié)構(gòu)體變量*/(2)結(jié)構(gòu)體和結(jié)構(gòu)體變量同時(shí)定義。struct studentchar name8;char sex;char nation10;int age;float score;x,y;/*這里同時(shí)定義了x,y兩個(gè)結(jié)構(gòu)體變量*/1.結(jié)構(gòu)體變量的定義方法9.1結(jié)構(gòu)體(變量)的定義與說明9.1.2結(jié)構(gòu)體變量的定義與賦值定義時(shí)可以省略結(jié)構(gòu)體名。struct char name8;char sex;char nation10;int age;float score;x,y;/

3、*這里同時(shí)定義了x,y兩個(gè)結(jié)構(gòu)體變量*/不建議省略結(jié)構(gòu)體名。一個(gè)明晰的結(jié)構(gòu)體名可以幫我們直觀地了解到本結(jié)構(gòu)體是針對(duì)哪個(gè)方面的數(shù)據(jù)構(gòu)造類型。9.1結(jié)構(gòu)體(變量)的定義與說明9.1.2結(jié)構(gòu)體變量的定義與賦值(3)結(jié)構(gòu)體的嵌套定義。所謂結(jié)構(gòu)體的嵌套定義指的是一個(gè)結(jié)構(gòu)體的變量做另一個(gè)結(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ì)是給各個(gè)成員進(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)體變量賦值時(shí),要以成員順序?yàn)橐罁?jù)按序賦值,用 括起來。9.1結(jié)構(gòu)體(變量)的定義與說明9.1.3結(jié)構(gòu)體變量的使用結(jié)構(gòu)體變量的使用實(shí)質(zhì)是結(jié)構(gòu)體成員的引用,即其單個(gè)成員的運(yùn)算操作(如賦值、輸入/輸出等)。結(jié)構(gòu)體成員的引用方法

5、是:結(jié)構(gòu)體變量名.成員名其中,“.”為成員運(yùn)算符。成員運(yùn)算符“.”、成員指向運(yùn)算符“-”、變址符“ ”和括號(hào)“()”運(yùn)算符在C語(yǔ)言中具有最高的運(yùn)算級(jí)別。9.1結(jié)構(gòu)體(變量)的定義與說明9.1.3結(jié)構(gòu)體變量的使用【例9-1】對(duì)結(jié)構(gòu)體變量進(jìn)行動(dòng)態(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; /*下面對(duì)結(jié)構(gòu)體變量x各成員進(jìn)行賦值*/strcpy(,Lily);/*不能寫成=Lily,因?yàn)閚ame數(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; /*嵌套定義時(shí)須用成員運(yùn)算符一級(jí)一級(jí)地找到最底層一級(jí)成員*/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)體變量單個(gè)成員的相互賦值*/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)存長(zhǎng)度計(jì)算結(jié)構(gòu)體是一種構(gòu)造數(shù)據(jù)類型,定義時(shí)系統(tǒng)并不分配內(nèi)存空間,但結(jié)構(gòu)體變量則是會(huì)分配內(nèi)存空間的。那么,系統(tǒng)

8、是如何給結(jié)構(gòu)體變量分配內(nèi)存空間的呢?在程序運(yùn)行中,結(jié)構(gòu)體變量各成員是同時(shí)存在于內(nèi)存中的,因而結(jié)構(gòu)體變量的內(nèi)存長(zhǎng)度是各成員的長(zhǎng)度之和。例如: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)存長(zhǎng)度計(jì)算結(jié)構(gòu)體變量x的內(nèi)存長(zhǎng)度計(jì)算如下:(1)成員char name20,長(zhǎng)度為20 B;(2)成員char sex,長(zhǎng)度為1 B;(3)成員

9、char nation10,長(zhǎng)度為10 B;(4)成員age,長(zhǎng)度為2 B;(5)成員score,長(zhǎng)度為4 B;(6)成員birthday,長(zhǎng)度為2 B(year)+2 B(month)+2 B(day)=6 B。故x的內(nèi)存長(zhǎng)度為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)示例中定義了兩個(gè)結(jié)構(gòu)體數(shù)組,其中數(shù)組stu1初始化了兩個(gè)元素。(2)要注意給結(jié)構(gòu)體數(shù)組初始化或給元素賦值時(shí),因?yàn)槊總€(gè)元素又是結(jié)構(gòu)體類型的變量,因此各元素的初值列表也要用 括起來。9.2結(jié)構(gòu)體數(shù)組9.2.2結(jié)構(gòu)體數(shù)組長(zhǎng)度的計(jì)算示例:struct studentchar name20;char sex;char nation10;int age;float score;stu15;結(jié)構(gòu)體數(shù)組長(zhǎng)度的計(jì)算方法是:(1)每個(gè)數(shù)組元素的長(zhǎng)度是:20+1+10+2+437 B。(2)共有5個(gè)元素,故該數(shù)組長(zhǎng)度為: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】定義一個(gè)名為student的結(jié)構(gòu)體,該結(jié)構(gòu)體包含姓名和成績(jī)兩個(gè)成員。定義一個(gè)含5個(gè)元素的結(jié)構(gòu)體數(shù)組stu,輸出5個(gè)同學(xué)的姓名和成績(jī)。輸入完畢自動(dòng)計(jì)算出每位同學(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ù)組元素的引用:輸入每個(gè)同學(xué)的3科成績(jī)*/for(i=0;i5;i+)sum=0;for(j=0;j3;j+)sum+=stui.scorej; /*數(shù)組元素的引用:統(tǒng)計(jì)出每個(gè)同學(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)算,在鏈接時(shí)不會(huì)鏈接上浮點(diǎn)鏈接庫(kù),因而會(huì)出現(xiàn)編譯成功但無法使用的情況。一個(gè)簡(jiǎn)單的解決方法是:調(diào)用數(shù)學(xué)頭文件“math.h”,并在主函數(shù)main()的第1行加一個(gè)關(guān)于浮點(diǎn)數(shù)運(yùn)算的表達(dá)式,最好帶一個(gè)庫(kù)函數(shù),如sqrt()。這樣,編譯時(shí)就可鏈接上浮點(diǎn)鏈接庫(kù)了。(2)在for循環(huán)輸入中,若成員中有char 字符變量成員,不要以單字符格式“%c”輸入,因?yàn)闊o結(jié)尾符0,循環(huán)輸入時(shí)編譯環(huán)境會(huì)忽視其操作。應(yīng)以“%s”進(jìn)行輸入,因?yàn)樽址到y(tǒng)會(huì)自動(dò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科成績(jī),浮點(diǎn)型*/stu2;int main()float x=sqrt(1); /*浮點(diǎn)數(shù)運(yùn)算表達(dá)式,目的是鏈接上浮點(diǎn)鏈接庫(kù)*/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ì)。某班進(jìn)行班長(zhǎng)投票選舉,班長(zhǎng)一職將在李陽(yáng)、趙明和吳莉3位同學(xué)中產(chǎn)生。該班共45位同學(xué),李、趙、吳3位同學(xué)不能參加投票。下面利用結(jié)構(gòu)體數(shù)據(jù)類型進(jìn)行投票,共投42次,輸出每個(gè)人的票數(shù)。注意,只能在這3位同學(xué)中產(chǎn)生,投票錯(cuò)誤無效,必須重新投票(為方便查看效果,程序模擬僅投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);”等價(jià)于“strcpy(*p).name,Wujie);”和“strcpy(p-name,Wujie);”。下面同理:(2)“x.sex=m”等價(jià)于“(*p).sex=m”和“p-sex=m”。(3)“x.age=15”等價(jià)于 “(*p).age=15”和“p-age=15”。(4)“x.score=623”等價(jià)于“(*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號(hào)元素)首地址,因?yàn)椤皊truct student *p1=stu;”,故結(jié)構(gòu)體數(shù)組指針p1也指向該結(jié)構(gòu)體數(shù)組首元素首地址(注意不是結(jié)構(gòu)體成員地址)。而p1+則指向下一元素(1號(hào)元素)的首地址,以此類推。(1)“”等價(jià)于“(*p1).name”和“p1-name”,故“strcpy(,Jack);”等價(jià)于“strcpy(*p1).name,Jack);”和“strcpy(p1-name,Jack)”

20、。2.結(jié)構(gòu)體數(shù)組指針在元素引用時(shí)的使用9.3結(jié)構(gòu)體指針9.3.2結(jié)構(gòu)體指針的運(yùn)用下面同理:(2)“stu1.age=16”等價(jià)于“*(p1+1).age=16”和“(p1+1)-age=16”。(3)“stu2.score=598”等價(jià)于“*(p1+2).score=598”和“(p1+2)-score=598”。因此,若要輸出9.3.1中結(jié)構(gòu)體數(shù)組各元素的成員值,可以使用for循環(huán)語(yǔ)句:for(p1=stu,p1name,p1-sex,p1-age,p1-score);結(jié)構(gòu)體數(shù)組指針指向各元素首地址如圖9-1所示,要清楚這個(gè)首地址并非元素成員的地址。圖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)體多個(gè)成員做實(shí)參進(jìn)行值傳遞。以下程序功能是:輸入3個(gè)學(xué)生的姓名和其4科成績(jī),計(jì)算其總分。#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; 很明顯,多個(gè)實(shí)參進(jìn)行值傳遞,系統(tǒng)必須開辟多個(gè)存

25、儲(chǔ)單元,效率是低下的。在函數(shù)調(diào)用中提高工作效率的參數(shù)傳遞方式莫過于地址傳遞,形實(shí)參指向同一個(gè)存儲(chǔ)單元,可想而知,相對(duì)于值傳遞來說,效率是翻倍的。9.4結(jié)構(gòu)體與函數(shù)9.4.2以結(jié)構(gòu)體指針做實(shí)參進(jìn)行地址傳遞結(jié)構(gòu)體指針做實(shí)參傳遞,大大提高運(yùn)算效率。以下程序的功能是輸入3個(gè)學(xué)生的姓名和其4科成績(jī),計(jì)算并輸出每個(gè)學(xué)生的總分和平均分。同時(shí),判斷成績(jī),總分大于等于320,輸出“Excellent”,小于320大于等于240,輸出“pass”,其他輸出“Fail”,最后對(duì)總分用冒泡法進(jìn)行降序排序。#include #include struct studentchar name8;float score4;

26、/*每個(gè)學(xué)生有4科成績(jī)*/float total;float average;stu3,*p=stu; /*結(jié)構(gòu)體指針p指向結(jié)構(gòu)體數(shù)組*/int main()float x=sqrt(1);/* 用于鏈接到浮點(diǎn)鏈接庫(kù)*/9.4結(jié)構(gòu)體與函數(shù)9.4.2以結(jié)構(gòu)體指針做實(shí)參進(jìn)行地址傳遞void add(struct student *p1); /*函數(shù)調(diào)用在函數(shù)定義之前,必須先對(duì)函數(shù)做聲明。該函數(shù)聲明的形參為結(jié)構(gòu)體指針。聲明在main()函數(shù)中,只能為main()函數(shù)調(diào)用*/add(p); /*調(diào)用時(shí)以結(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個(gè)學(xué)生的姓名和每個(gè)學(xué)生的4科成績(jī)*/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;/*每個(gè)學(xué)生的總分計(jì)算*/p1-average=p1-total/4; /*每個(gè)學(xué)生的平均分計(jì)算*/printf(Name:%s Tot

28、al=%.1f average=%.2f-,p1-name,p1-total,p1-average);/*下面進(jìn)行成績(jī)判斷*/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)行地址傳遞/*用冒泡法對(duì)總分進(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語(yǔ)言中,typedef是類型別名定義符,它定義一個(gè)類型的別名,然后就可以通過這個(gè)別名來定義其他同類型的變量。在結(jié)構(gòu)體中,typedef尤其有用,可以為用戶減少不少的工作量;malloc函數(shù)在“堆棧”一節(jié)有簡(jiǎn)述,它是動(dòng)態(tài)獲?。ǚ峙洌﹥?nèi)存空間的函數(shù),它包含于malloc.h、stdlib.h等頭文件中,所申請(qǐng)的空間用完后用free()函數(shù)來釋放。9.

30、5typedef、malloc的使用9.5.1typedef的用法先來看一個(gè)例子:“char *p;”定義了一個(gè)字符指針p;“typedef char *PCHAR;”定義了一個(gè)字符類型指針別名PCHAR;“PCHAR p1,p2;”定義了2個(gè)字符指針p1,p2。這個(gè)例子清楚地表明了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;/*這里定義了一個(gè)結(jié)構(gòu)體類別名STUD*/STUD *p;/*用這個(gè)類別名定義了一個(gè)結(jié)構(gòu)體指針,等同于“struct student *p;”*/STUD x;/*用這個(gè)類別名定義了一個(gè)結(jié)構(gòu)體變量,等同于“struct student x;”*/9.5typedef、malloc的使用9.5.1typedef的用法1.malloc申請(qǐng)內(nèi)存空間的方法(返回的指針類型)malloc(指定的長(zhǎng)度(字節(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指向動(dòng)態(tài)分配的長(zhǎng)度為(sizeof(STUD)的內(nèi)存塊,即18 B的內(nèi)存長(zhǎng)度。它等同于:p=(struct student *)malloc(sizeof(struct student)9.5typedef、malloc的使用9.5.1typedef的用法示例2:接上面結(jié)構(gòu)體示例:“p=(struct student *)malloc(100);”意為:給p動(dòng)態(tài)分配100 B的內(nèi)存空間。9.5typedef、malloc的使用9.5.1typedef的用法2.釋放malloc

33、動(dòng)態(tài)申請(qǐng)的內(nèi)存空間方法:free(指針名);例如,malloc動(dòng)態(tài)內(nèi)存申請(qǐng)與釋放:用malloc動(dòng)態(tài)申請(qǐng)的內(nèi)存須用“free(指針名)”進(jìn)行釋放。例如:free(p);例如,malloc動(dòng)態(tài)內(nèi)存申請(qǐng)與釋放:#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);/*三個(gè)指針動(dòng)態(tài)分配長(zhǎng)度不一的內(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動(dòng)態(tài)分配內(nèi)存成功,則返回指向被分配內(nèi)存的指針。(2)如果malloc動(dòng)態(tài)分配內(nèi)存不成功,則返回空指針NULL。(3)malloc不能自動(dòng)計(jì)算長(zhǎng)度,需指定長(zhǎng)度或由sizeof()計(jì)算。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;/*注意別丟了分號(hào)*/例如,定義一個(gè)名為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兩個(gè)聯(lián)合體變量*/9.6聯(lián)合體(變量)的定義與說明9.6.2聯(lián)合體變量的定義2.聯(lián)合體和聯(lián)合體變量同時(shí)定義union

37、 studentchar name8;char sex;char nation10;int age;float score;x,y;/*這里同時(shí)定義了x,y兩個(gè)聯(lián)合體變量*/定義時(shí)可以省略聯(lián)合體名。union char name8;char sex;char nation10;int age;float score;x,y;/*這里同時(shí)定義了x,y兩個(gè)聯(lián)合體變量*/9.6聯(lián)合體(變量)的定義與說明9.6.3聯(lián)合體變量的使用及內(nèi)存長(zhǎng)度的計(jì)算聯(lián)合體變量的使用實(shí)質(zhì)是聯(lián)合體成員的引用,即其某個(gè)成員的運(yùn)算操作(如賦值、輸入/輸出等)。聯(lián)合體成員的引用方法是:聯(lián)合體變量名.成員名(1)聯(lián)合體變量各成員共同

38、占用一段內(nèi)存。(2)內(nèi)存長(zhǎng)度最長(zhǎng)的成員就是該聯(lián)合體變量的內(nèi)存長(zhǎng)度。(3)因?yàn)楦鞒蓡T共同占用一段內(nèi)存,因而:聯(lián)合體變量不能像結(jié)構(gòu)體變量那樣進(jìn)行初始化,只能在程序中進(jìn)行賦值。每次只能對(duì)聯(lián)合體變量某一成員進(jìn)行賦值,因此,一個(gè)聯(lián)合體變量的值就是聯(lián)合體變量的某一個(gè)成員的值。聯(lián)合體變量在運(yùn)行中任何時(shí)候只能有一個(gè)成員存在。例如,聯(lián)合體變量各成員共占一段內(nèi)存示意圖如圖9-2所示。9.6聯(lián)合體(變量)的定義與說明9.6.3聯(lián)合體變量的使用及內(nèi)存長(zhǎng)度的計(jì)算圖9-2聯(lián)合體變量各成員共占一段內(nèi)存示意圖unionint i;char ch;float score; a,b,c;成員score的內(nèi)存長(zhǎng)度就是結(jié)構(gòu)體變量a、

39、b、c的內(nèi)存長(zhǎng)度,為4 B。任何時(shí)候只能有一個(gè)成員(ch、i或者score)存在。各成員不能初始化,只能在程序中進(jìn)行賦值。9.6聯(lián)合體(變量)的定義與說明9.6.3聯(lián)合體變量的使用及內(nèi)存長(zhǎng)度的計(jì)算【例9-5】結(jié)構(gòu)體中的聯(lián)合體。下面為一個(gè)學(xué)生和教師共用的結(jié)構(gòu)體,學(xué)生和教師都有共同的結(jié)構(gòu)體變量成員:姓名、年齡和工作。學(xué)生和教師的不同之處是班級(jí)(學(xué)生)和部門(教師),這兩個(gè)就作為聯(lián)合體變量成員。程序的功能是:輸入人員的信息(結(jié)構(gòu)體),如果身份是學(xué)生,就輸入班級(jí);如果身份是教師,就輸入部門(聯(lián)合體)。最后把輸入結(jié)果顯示出來。9.6聯(lián)合體(變量)的定義與說明9.6.3聯(lián)合體變量的使用及內(nèi)存長(zhǎng)度的計(jì)算#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)存長(zhǎng)度的計(jì)算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)合體成員賦值,只能給一個(gè)成員賦值,且只允許一個(gè)成員存在*/elseprintf(Input office:);scanf(%s,bodyi.depa.office); /*在程序中給聯(lián)合體成員賦值,只能給一個(gè)成員賦值,且只允許一個(gè)成員存在*/ 9.6聯(lián)合體(變量)的定義與說明9.6.3聯(lián)合體變量的使用及內(nèi)存長(zhǎng)度的計(jì)算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)存長(zhǎng)度的計(jì)算【例9-6】進(jìn)一步理解聯(lián)合體在程序中只允許一個(gè)成員存在。int main()unionunsigned int n;unsigned char c;u;/*聯(lián)合體變量*/u

43、.n=66 ; u.c=A; /*在程序中每次只能給一個(gè)成員賦值,因此第1個(gè)賦值無效*/printf(%c,u.n);/*內(nèi)存中只保留有A這個(gè)值,故輸出字符A*/9.6聯(lián)合體(變量)的定義與說明9.6.3聯(lián)合體變量的使用及內(nèi)存長(zhǎng)度的計(jì)算【例9-7】聯(lián)合體中的結(jié)構(gòu)體。聯(lián)合體變量a有兩個(gè)成員,其中一個(gè)成員為結(jié)構(gòu)體變量u。就外層(聯(lián)合體)來說,在程序中只允許一個(gè)成員存在;就內(nèi)層來說(結(jié)構(gòu)體),結(jié)構(gòu)體各成員是同時(shí)存在的。union structint x;char y;float z; u; /*結(jié)構(gòu)體變量作為聯(lián)合體的一個(gè)成員*/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)存長(zhǎng)度的計(jì)算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)識(shí)符之間只能用逗號(hào)“,”隔開,最后一個(gè)標(biāo)識(shí)符后省略逗號(hào)。(2)定義了3個(gè)枚舉變量:a、b、c。(3)標(biāo)識(shí)符為Sunday到Saturday,即星期天到星期六。(4)標(biāo)識(shí)符Sunday初始化為0,其后的標(biāo)識(shí)符都沒有初始化,則順次加1,即Monday值

46、為1,Tuesday值為2,以此類推。9.7枚舉9.7.2枚舉的具體規(guī)則(1)枚舉值表只能是整型常量,不能是變量,因此不能對(duì)枚舉值進(jìn)行任何賦值。例如:enumweekdaySunday,Monday,Tuesday,Wednsday,Thursday,Friday,Saturdaya,b,c; Sunday=0;/*這是錯(cuò)誤的*/(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)枚舉中的某個(gè)成員賦值后,其后的成員按依次加1的規(guī)則確定其值。9.7枚舉9.7.2枚舉的具體規(guī)則(4)變量也可以單獨(dú)定義

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(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)論