第9章-結(jié)構(gòu)體、共用體與自定義類型_第1頁
第9章-結(jié)構(gòu)體、共用體與自定義類型_第2頁
第9章-結(jié)構(gòu)體、共用體與自定義類型_第3頁
第9章-結(jié)構(gòu)體、共用體與自定義類型_第4頁
第9章-結(jié)構(gòu)體、共用體與自定義類型_第5頁
已閱讀5頁,還剩36頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

第9章結(jié)構(gòu)體、共用體與自定義類型-2-★結(jié)構(gòu)體的概念★結(jié)構(gòu)體數(shù)組★指向結(jié)構(gòu)體類型數(shù)據(jù)的指針★共用體★用typedef定義類型★程序設(shè)計(jì)舉例本章教學(xué)內(nèi)容:本章教學(xué)目標(biāo):★理解和掌握結(jié)構(gòu)體類型的定義、結(jié)構(gòu)體變量的定義與初始

化、

結(jié)構(gòu)體變量成員的引用?!锢斫夂驼莆战Y(jié)構(gòu)體數(shù)組的定義、初始化及應(yīng)用?!?/p>

理解和掌握指向結(jié)構(gòu)體變量的指針及指向結(jié)構(gòu)體數(shù)組的指針?!锪私夤灿皿w類型的定義、共用體變量的定義及引用?!?/p>

能夠熟練用typedef定義數(shù)據(jù)類型。-3-

9.1結(jié)構(gòu)體的概念

有時(shí)需要使用由多種類型數(shù)據(jù)組合而成的一種構(gòu)造型數(shù)據(jù)。例如,要反映一個(gè)學(xué)生的基本情況,需要表示出的數(shù)據(jù)有學(xué)生的學(xué)號、姓名、性別、年齡、成績等數(shù)據(jù)項(xiàng),這些數(shù)據(jù)項(xiàng)相互聯(lián)系,共同構(gòu)成一個(gè)整體。而這些數(shù)據(jù)項(xiàng)的數(shù)據(jù)類型又各不相同,這就要求定義出一種構(gòu)造型數(shù)據(jù),該構(gòu)造型數(shù)據(jù)中的每一個(gè)分項(xiàng)的數(shù)據(jù)類型可以各不相同。在這種情況下,結(jié)構(gòu)體類型便應(yīng)運(yùn)而生。-4-

結(jié)構(gòu)體類型的定義

結(jié)構(gòu)體類型是用戶在程序中自己定義的一種數(shù)據(jù)類型。結(jié)構(gòu)型必須先定義,然后利用已經(jīng)定義好的結(jié)構(gòu)型來定義變量、數(shù)組、指針等。

定義結(jié)構(gòu)體類型的一般形式為:

struct結(jié)構(gòu)體類型名{數(shù)據(jù)類型1成員名1;

數(shù)據(jù)類型2成員名2;

數(shù)據(jù)類型3成員名3;……

數(shù)據(jù)類型n成員名n;};-5-結(jié)構(gòu)體類型的定義例如,定義一個(gè)結(jié)構(gòu)體類型student,如下:structstudent{intnumber;charname[10];charsex;intage;floatscore;};-6-結(jié)構(gòu)體類型的定義【例題9-1】結(jié)構(gòu)體型嵌套的例子。

為了存放一個(gè)人的姓名、性別,出生日期、年齡,可以定義以下的嵌套結(jié)構(gòu)體型。structbirthday{inty;intm;intd;};structperson{charname[10];charsex;structbirthdaybir;doublewage;};-7-9.1.2結(jié)構(gòu)體類型變量的定義及初始化結(jié)構(gòu)體類型變量的定義一般有三種形式:(1)先定義結(jié)構(gòu)體類型,再定義結(jié)構(gòu)體類型的變量。

定義結(jié)構(gòu)體類型變量的一般形式為:

結(jié)構(gòu)體類型名

結(jié)構(gòu)體變量名;

例如:【例題9-2】定義描述學(xué)生信息(學(xué)號、姓名、性別、年齡、成績)的結(jié)

構(gòu)型及2個(gè)該結(jié)構(gòu)型的變量,程序代碼段如下:structstudent{intnumber;charname[10];charsex;intage;floatscore;};structstudentstu1,stu2;-8-結(jié)構(gòu)體類型變量的定義及初始化(續(xù))(2)定義結(jié)構(gòu)型的同時(shí)定義結(jié)構(gòu)體變量及初始化

可以在定義結(jié)構(gòu)型的同時(shí)定義結(jié)構(gòu)體變量及初始化,這種定義的一般形式為:-9-

struct結(jié)構(gòu)體名{數(shù)據(jù)類型1成員名1;

數(shù)據(jù)類型2成員名2;

數(shù)據(jù)類型3成員名3;……

數(shù)據(jù)類型n成員名n;}變量名表列及賦初值;structstudent{intnumber;charname[10];charsex;intage;floatscore;}stu1={1001,“yang”,‘F’,21,98.5},stu2={1002,“zhang”,‘M’,20,86.0};結(jié)構(gòu)體類型變量的定義及初始化(續(xù))(3)可以省略結(jié)構(gòu)體名,定義結(jié)構(gòu)體型的同時(shí)定義變量并賦初值。

這種定義的一般形式為:-10-

struct{數(shù)據(jù)類型1成員名1;

數(shù)據(jù)類型2成員名2;

數(shù)據(jù)類型3成員名3;……

數(shù)據(jù)類型n成員名n;}變量名表列及賦初值;struct{intnumber;charname[10];charsex;intage;floatscore;}stu1={1001,“yang”,‘F’,21,98.5},stu2={1002,“zhang”,‘M’,20,86.0};9.1.3結(jié)構(gòu)體類型變量成員的引用

定義好結(jié)構(gòu)體變量后,就可以使用變量了。一般不能直接使用結(jié)構(gòu)體變量,只能引用結(jié)構(gòu)體變量的成員。

引用結(jié)構(gòu)體變量成員的一般形式如下:

結(jié)構(gòu)體變量名.成員名-11-9.1.3結(jié)構(gòu)體類型變量成員的引用(續(xù))-12-【例9-3】引用結(jié)構(gòu)體變量成員的例子。#include<stdio.h>#include<string.h>intmain(){structstudent{intnumber;charname[10];charsex;doublescore[2];};structstudents1;s1.number=2015001;strcpy(,"yang");s1.sex=‘F’;s1.score[0]=94.5;s1.score[1]=87.5;printf("number=%d,name=%s,sex=%c,",s1.number,,s1.sex);printf("score1=%.2lf,score2=%.2lf\n",s1.score[0],s1.score[1]);return0;}

程序的運(yùn)行結(jié)果如下圖9-1所示:9.1.3結(jié)構(gòu)體類型變量成員的引用(續(xù))在引用結(jié)構(gòu)體變量的成員時(shí),應(yīng)注意以下幾點(diǎn):(1)不能整體引用結(jié)構(gòu)體變量,只能對結(jié)構(gòu)體變量的成員分別引用。如上例9-3中,輸出語句若寫

成下列形式,則是錯誤的。printf("number=%d,name=%s,sex=%c,score1=%.2lf,score2=%.2lf\n",s1);(2)結(jié)構(gòu)體變量的成員可以象普通的變量一樣參加各種運(yùn)算。例如:s1.score[0]=s1.score[0]+10;s1.score[0]=s1.score[1];(3)可以引用結(jié)構(gòu)體變量的地址,也可以引用結(jié)構(gòu)體變量成員的地址。下列表示都是正確的。scanf(“%d”,&s1.number);//輸入s1.number(學(xué)生的學(xué)號)值。printf(“%x”,&s1);//輸出s1的起始地址。

但注意,要輸入結(jié)構(gòu)體變量成員的值,應(yīng)該分別輸入各個(gè)成員值,不能整體讀入結(jié)構(gòu)體變量。下列形式是錯誤的:scanf(“%d,%s,%c,%lf,%lf”,s1);(4)對于嵌套的結(jié)構(gòu)體變量,應(yīng)用成員運(yùn)算符,一級一級引用,直到找到最低一級成員,只能對最低級成員進(jìn)行各種運(yùn)算。例如,;stu1.bir.y;//表示學(xué)生stu1出生的年份。-13-嵌套的結(jié)構(gòu)體變量成員引用-14-【例9-4】嵌套的結(jié)構(gòu)體變量成員引用的例子。#include<stdio.h>#include<string.h>structbirthday{intyear;intmonth;intday;};structperson{charname[10];charsex;structbirthdaybir;charaddress[30];}p;intmain(){strcpy(,"zhang");p.sex='M';p.bir.year=1995;p.bir.month=10;p.bir.day=21;strcpy(p.address,"shanghai");printf("name=%s,sex=%c,address=%s\n",,p.sex,p.address);printf("birthday=%4d年%2d月%2d日\n",p.bir.year,p.bir.month,p.bir.day);return0;}9.2結(jié)構(gòu)體數(shù)組

結(jié)構(gòu)體數(shù)組中的每一個(gè)元素相當(dāng)于一個(gè)具有相同結(jié)構(gòu)體類型的變量,結(jié)構(gòu)體數(shù)組是具有相同類型的結(jié)構(gòu)體變量的集合。

9.2.1結(jié)構(gòu)體數(shù)組的定義

定義結(jié)構(gòu)體數(shù)組的方法與定義結(jié)構(gòu)體變量的方法一樣,把變量名改為數(shù)組即可,定義結(jié)構(gòu)體數(shù)組也有三種方式。在此省去。-15-9.2.2結(jié)構(gòu)體數(shù)組的初始化

對結(jié)構(gòu)體數(shù)組的初始化,要分別對每一個(gè)數(shù)組元素初始化。structstudent{intnumber;charname[10];charsex;doublescore[2];};structstudentstu[5]={{2015001,“zhang”,‘T’,67.5,89.5},{2015002,“l(fā)iu”,‘F’,80.0,86.5},{2015003,“sun”,‘T’,85.0,81.0},{2015004,“yang”,‘F’,72.0,75.5},{2015005,“l(fā)i”,‘T’,86.0,75.0}};-16-

9.2.3結(jié)構(gòu)體數(shù)組應(yīng)用舉例

-17-【例9-4】設(shè)有如下學(xué)生信息:學(xué)號、姓名、出生年月(包含整型的年、月、日)。編寫一程序,輸入5個(gè)學(xué)生的信息,輸出所有學(xué)生的學(xué)號和姓名。#defineN5#include<stdio.h>intmain(){structbirthday{intyear;intmonth;intday;};structdate{longnum;charname[10];structbirthdaybir;}stu[N];for(inti=0;i<N;i++){printf("請輸入第%d個(gè)學(xué)生信息\n",i+1);scanf("%ld",&stu[i].num);scanf("%s",stu[i].name);scanf("%d,%d,%d",&stu[i].bir.year,&stu[i].bir.month,&stu[i].bir.day);}printf("\n");printf("學(xué)號

姓名\n");for(i=0;i<N;i++){printf("%-10ld",stu[i].num);printf("%-11s\n",stu[i].name);}return0;}9.2.3結(jié)構(gòu)體數(shù)組應(yīng)用舉例-18-例9-4運(yùn)行結(jié)果9.3指向結(jié)構(gòu)體類型數(shù)據(jù)的指針指向結(jié)構(gòu)體變量的指針

指向結(jié)構(gòu)體變量的指針定義的一般形式為:

struct結(jié)構(gòu)體類型名*指針變量名;

例如:structstudent*p,stu;p=&stu;

常用的訪問結(jié)構(gòu)體變量成員的方法有以下三種:

(1)(*指針變量名).結(jié)構(gòu)體成員名(2)指針變量名->結(jié)構(gòu)體成員名(3)結(jié)構(gòu)體變量.成員名-19-指向結(jié)構(gòu)體變量的指針

-20-【例9-6】使用指向結(jié)構(gòu)體變量的指針輸出學(xué)生信息。#include<stdio.h>#include<string.h>structstudent{longnum;charname[10];charsex;intage;doublescore;};intmain(){structstudentstu1;structstudent*p;p=&stu1;stu1.num=20150101;strcpy(,”ZhangJun”);stu1.sex=’M’;stu1.age=21;stu1.score=92.5;printf(“第一次輸出學(xué)生信息:\n”);printf(“num:%ld,name:%s,sex:%c,age:%d,score:%ld\n”,p->num,p->name,p->sex,p->age,p->score);printf(“第二次輸出學(xué)生信息:\n”);printf(“num:%ld,name:%s,sex:%c,age:%d,score:%ld\n”,(*p).num,(*p).name,(*p).sex,(*p).age,(*p).score);printf(“第三次輸出學(xué)生信息:\n”);printf(“num:%ld,name:%s,sex:%c,age:%d,score:%ld\n”,stu1.num,,stu1.sex,stu1.age,stu1.score);return0;}9.3.2指向結(jié)構(gòu)體數(shù)組的指針

指針變量可以指向一個(gè)結(jié)構(gòu)體數(shù)組,此時(shí)結(jié)構(gòu)體指針變量的值是整個(gè)結(jié)構(gòu)體數(shù)組的首地址。結(jié)構(gòu)體指針變量也可指向結(jié)構(gòu)體數(shù)組中的某一個(gè)元素,此時(shí)結(jié)構(gòu)體指針變量的值是該數(shù)組元素的首地址。structstudent{longnum;charname[10];charsex;intage;doublescore;};structstudentstu[5],*p;-21-9.3.2指向結(jié)構(gòu)體數(shù)組的指針(續(xù))

若執(zhí)行p=stu;語句,則此時(shí)結(jié)構(gòu)體指針p就指向了結(jié)構(gòu)體數(shù)組stu的首地址。p是指向一維結(jié)構(gòu)體數(shù)組的指針,對數(shù)組元素的引用有3種方法。(1)指針法。

若p指向數(shù)組的某一個(gè)元素,則p--表示指針上移,指向前一個(gè)元素;p++表示指針下移,指向其后一個(gè)元素。例如:(++p)->name,先使p自加1,即指針指向下一個(gè)元素,然后取得它指向元素的name成員值。(p++)->name,先得到p->name的值,然后使p自加1,指向下一個(gè)元素。

請注意以上二者的區(qū)別。同樣地:(--p)->name,先使p自減1,即指針指向上一個(gè)元素,然后取得它指向元素的name成員值。(p--)->name,先得到p->name的值,然后使p自減1,指向上一個(gè)元素。-22-9.3.2指向結(jié)構(gòu)體數(shù)組的指針(續(xù))

(2)地址法。

當(dāng)執(zhí)行p=stu;語句后,stu和p均表示數(shù)組的首地址,即第一個(gè)元素的地址&stu[0];stu+i和p+i均表示數(shù)組第i個(gè)元素的地址,即&stu[i]。數(shù)組元素各成員的引用形式為(stu+i)->num和(stu+i)->name,或者(p+i)->num和(p+i)->name等。(3)指針的數(shù)組表示法

若p=stu,則指針p指向數(shù)組stu,p[i]表示數(shù)組的第i個(gè)元素,p[i]與stu[i]含義相同,都是表示數(shù)組的第i+1個(gè)元素。對數(shù)組成員的引用可表示為p[i].num,p[i].name等。-23-9.3.2指向結(jié)構(gòu)體數(shù)組的指針(續(xù))-24-【例9-7】指向結(jié)構(gòu)體數(shù)組的指針的應(yīng)用。#include<stdio.h>structstu{intnum;char*name;charsex;floatscore;}boy[5]={{101,"Zhouping",'M',45},{102,"Zhangping",'M',62.5},{103,"Lioufang",'F',92.5},{104,"Chengling",'F',87},{105,"Wangming",'M',58},};intmain(){structstu*ps;for(ps=boy;ps<boy+5;ps++)printf("%d,%s,%c,%.2f\n",ps->num,ps->name,ps->sex,ps->score);return0;}9.3.2指向結(jié)構(gòu)體數(shù)組的指針(續(xù))-25-

【例9-8】指向結(jié)構(gòu)體數(shù)組的指針的應(yīng)用。#include<stdio.h>structdata/*定義結(jié)構(gòu)體類型*/{intday;intmonth;intyear;};structstu/*定義結(jié)構(gòu)體類型*/{charname[20];longnum;structdatabirthday;};intmain(){inti;structstu*p,student[4]={{"liying",1,1978,5,23},{"wangping",2,1979,3,14},{"libo",3,1980,5,6},{"xuyan",4,1980,4,21}};p=studentfor(i=0;i<4;i++)printf("%20s%10ld%10d//%d//%d\n",(p+i)->name,(p+i)->num,(p+i)->birthday.year,(p+i)->birthday.month,(p+i)->birthday.day);}9.4共用體

在程序設(shè)計(jì)中,有時(shí)為了節(jié)約內(nèi)存空間,要求某數(shù)據(jù)存儲區(qū)在不同的時(shí)間分別存儲不同類型的數(shù)據(jù),后存儲的類型數(shù)據(jù)會覆蓋前一次存儲的類型數(shù)據(jù),這些不同的數(shù)據(jù)類型分時(shí)共享同一段內(nèi)存單元,此時(shí)可以用共用體來實(shí)現(xiàn)這種設(shè)計(jì)。在共用體中,所有的成員共享同一個(gè)內(nèi)存空間,共用體長度是所有成員中長度最長的成員長度。-26-

9.4.1共用體類型的定義

共用體類型定義的一般形式為:

union共用體名{類型名1成員名1;

類型名2成員名2;……

類型名n成員名n;};

說明:union是關(guān)鍵字,是共用體類型的標(biāo)志。共用體的成員類型可以是基本數(shù)據(jù)類型,也可以是數(shù)組、指針、結(jié)構(gòu)體或共用體類型等。共用體的所有成員共享同一個(gè)內(nèi)存空間,共用體長度是所有成員中長度最長的成員長度。-27-例如,定義一種共用體類型data,如下:uniondata{inti;charch;floatf;doubled;};

定義了一種共用體類型data,該共用體類型有4個(gè)成員,共用體data的長度是最大成員d的長度8字節(jié)。9.4.2共用體變量的定義

(1)在定義共用體類型的同時(shí),定義共用體變量。一般形式如下:

union共用體類型名{類型名1成員名1;

類型名2成員名2;……

類型名3成員名3;}變量名表列;-28-例如:unionun_type{inta;floatb;charc;doubled;}u1,u2;

共用體變量的定義同結(jié)構(gòu)體變量的定義一樣,有如下3種形式:9.4.2共用體變量的定義(續(xù))(2)先定義共用體類型,再定義共

用體變量。一般形式如下:

union共用體類型名{類型名1成員名1;

類型名2成員名2;……

類型名3成員名3;};

共用體類型名

變量名列表;-29-上例也可改為:unionun_type{inta;floatb;charc;doubled;};un_typeu1,u2;9.4.2共用體變量的定義(續(xù))(3)直接定義共用體類型的變量。

一般形式如下:

union{類型名1成員名1;

類型名2成員名2;……

類型名3成員名3;}變量名表列;-30-

這種形式與第(1)種形式相比,省略了共用體類型名。上例也可寫為:union{inta;floatb;charc;doubled;}u1,u2;共用體變量的引用

引用共用體變量的成員的方法與引用結(jié)構(gòu)體變量的成員的方法一樣,有三種形式:(1)共用體變量名.共用體成員名(2)共用體指針變量名->共用體成員名(3)(*共用體指針變量名).共用體成員名-31-共用體變量的引用(續(xù))【例9-9】共用體變量的引用。程序代碼如下:#include<stdio.h>unionaa{inta;charb;floatc;doubled;}x;-32-intmain(){x.a=10;printf("%d\n",x.a);x.b='H';printf("%c\n",x.b);x.c=87.5;x.d=98.5;printf("%f,%lf\n",x.c,x.d);printf("\n");return0;}共用體變量的引用(續(xù))說明:(1)在共用體變量中,可以包含若干個(gè)類型不同的成員,但共用體成員不能同時(shí)使用。在每一時(shí)刻,只有一個(gè)成員及一種類型起作用,不能同時(shí)引用多個(gè)成員及多種類型。(2)共用體變量中起作用的成員值是最后一次存放的成員值,即共用體變

量所有成員共用同一段內(nèi)存單元,后來存放的值將原先存放的值覆蓋,故只能使用最后一次給定的成員值。(3)共用體變量的地址和它的各個(gè)成員的地址相同。(4)不能對共用體變量初始化和賦值,也不能企圖引用共用體變量名來得到某成員的值。(5)共用體變量不能作函數(shù)參數(shù),函數(shù)的返回值也不能是共用體類型。(6)共用體類型和結(jié)構(gòu)體類型可以相互嵌套,共用體中成員可以為數(shù)組,甚至還可以定義共用體數(shù)組。-33-9.5用typedef定義類型

1.自定義基本類型

用戶自定義類型的一般格式為:

typedef原類型名

新類型名;

表示用新類型名來代替原類型名。

如:typedefintINTEGER;INTEGERa,b;

這兩句等價(jià)于:inta,b;【例9-10】使用簡單的自定義基本數(shù)據(jù)類型。#include<stdio.h>typedefintINTEGER;typedefcharCHARACTER;intmain(){INTEGERa=15;//該語句相當(dāng)于inta=15;CHARACTERb=’M’;//該語句相當(dāng)于charb=’M’;……return0;}-34-9.5用typedef定義類型(續(xù))2.自定義數(shù)組類型

利用自定義類型語句可以對數(shù)組類型定義為用戶新類型。

一般格式如下:

typedef基本數(shù)據(jù)類型

新類型名[數(shù)組長度];

功能:用“新類型”來定義由“基本數(shù)據(jù)類型符”聲明的數(shù)組,數(shù)組的長度為定義時(shí)說明的“數(shù)組長度”。

【例9-11】自定義數(shù)組類型舉例。

#include<stdio.h>typedefintI_ARRAY[20];typedefdoubleD_ARRAY[10];intmain(){I_ARRAYa={12,34,45,60},b={10,20,30,40};D_ARRAYm={34.5,67.8,89.0};……return0;}

-35-9.5用typedef定義類型(續(xù))3.自定義結(jié)構(gòu)型

利用自定義類型語句可以對程序中需要的結(jié)構(gòu)型定義為一個(gè)用戶新類型。一般格式如下:typedefstruct{數(shù)據(jù)類型名1成員名1;

數(shù)據(jù)類型名2成員名2;

數(shù)據(jù)類型名3成員名3;……

數(shù)據(jù)類型名n成員名n;}用戶新類型;

功能:用“用戶新類型”可以定義含有上述n個(gè)成員的結(jié)構(gòu)體變量、結(jié)構(gòu)體數(shù)組和結(jié)構(gòu)體指針變量等。-36-9.5用typedef定義類型(續(xù))【例9-12】自定義結(jié)構(gòu)型舉例。#include<stdio.h>typedefstruct{longpersonID;charname[10];doublesalary;}PERSON;intmain(){PERSONp1,p2[3];{longpersonID;charname[10];doubles

溫馨提示

  • 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)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論