结构体和共用体_第1页
结构体和共用体_第2页
结构体和共用体_第3页
结构体和共用体_第4页
结构体和共用体_第5页
已阅读5页,还剩46页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

结构体和共用体演示文稿第一页,共51页。(优选)结构体和共用体第二页,共51页。一个学生的学号、姓名、性别、年龄、成绩、地址,是互相联系的数据,在C语言中用“结构体(structure)”来定义。structstudent

{

int

num;

/*学号*/

char

name[20];

/*姓名*/

char

sex;

/*性别*/

int

age;

/*年龄*/

float

score;

/*成绩*/

char

addr[30];

/*地址*/

};

第三页,共51页。§11.2结构体变量的定义结构体是一种数据类型(像int、char、flaot数据类型一样),可以用它定义变量。

用结构体类型定义变量的方式有三种:第四页,共51页。一、先定义结构体类型,再定义变量例、structstudent

{

int

num;

char

name[20];

char

sex;

int

age;

float

score;

char

addr[30];

};structstudentstudent1,student2;

第五页,共51页。结构体变量中的各成员,在内存中顺序存放。结构体变量所占内存大小用运算符sizeof计算。例、printf("%d%d\n",sizeof(structstudent),sizeof(student1));第六页,共51页。为了方便,可以这样定义结构体变量:#defineSTUDENTstructstudentSTUDENT

{

int

num;

char

name[20];

char

sex;

int

age;

float

score;

char

addr[30];

};STUDENTstudent1,student2;第七页,共51页。二、在定义类型的同时定义变量structstudent

{

int

num;

char

name[20];

char

sex;

int

age;

float

score;

char

addr[30];

}student1,student2;第八页,共51页。三、直接定义变量struct

{

int

num;

char

name[20];

char

sex;

int

age;

float

score;

char

addr[30];

}student1,student2;第九页,共51页。四、成员是另一个结构体变量structdate

intmonth;

intday;

intyear;

};structstudent

{

int

num;

char

name[20];

char

sex;

int

age;

structdatebirthday;

char

addr[30];

}student1,student2;

第十页,共51页。第十一页,共51页。§11.3结构体变量的引用1、一般情况下,不能将一个结构体变量作为整体来引用,只能引用其中的成员(分量)。引用结构体成员的方式:

结构体变量名.成员名.是“成员运算符”例1、

printf("%d,%s,%c,%d,%f,%s",student1.num,,student1.sex,

student1.age,student1.score,sutdent1.addr);

printf("%d,%s,%c,%d,%f,%s",student1);第十二页,共51页。例2、

student2.score=student1.score;

sum=student1.score+student2.score;

student1.age++;

++student1.age;例3、

scanf("%d",&student1.num);第十三页,共51页。2、当成员是另一个结构体变量时,应一级一级地引用成员。例4、

student1.num;

;

student1.birthday.month;

student1.birthday.day;

student1.birthday.year;第十四页,共51页。3、仅在以下两种情况下,可以把结构体变量作为一个整体来访问。(1)结构体变量整体赋值,例、

student2=student1;(2)取结构体变量地址,例、

printf("%x",&student1);

返回本章目录第十五页,共51页。§11.4结构体变量的初始化structstudent

{

longintnum;

char

name[20];

char

sex;

char

addr[20];}a={89031,"LiLin",'M',"123BeijingRoad"};注意:不能在结构体内赋初值。例、structstudent

{

longintnum=89031;

char

name[20]="LiLin";

char

sex='M';

char

addr[30]="123BejingRoad";

}a;第十六页,共51页。§11.5结构体数组一、结构体数组的定义

structstudent

{

intnum;

charname[20];

charsex;

intage;

floatscore;

charaddr[30];

};

structstudentstu[3];

第十七页,共51页。第十八页,共51页。二、结构体数组的初始化(见课本P266)

structstudent

{

intnum;

charname[20];

charsex;

intage;

floatscore;

charaddr[30];

}stu[3]={

{10101,"LiLin",

'M',18,87.5,"103BejingRoad"},

{10102,"ZhangFun",'M',19,99,

"130ShanghaiRoaad"},

{10104,"WangMin",'F',20,78.5,"1010ZhongshanRoad"}};第十九页,共51页。三、举例[例11.2]对候选人得票的统计程序。设有三个候选人,每次输入一个得票的候选人的名字,要求最后输出各候选人得票结果。运行第二十页,共51页。§11.6结构体指针一、结构体指针结构体指针:指向结构体变量的指针。例、第二十一页,共51页。structstudent

{

longintnnum;

char

name[20];

char

sex;

float

score;

};

structstudentstu_1;

structstudent*p;

p=&stu_1;第二十二页,共51页。结构体指针,通过指向运算符->引用结构体中的成员。例、

p->num

p->name

p->sex

p->score因此结构体成员的引用方式有以下三种:

结构体变量.成员名

(*p).成员名

p->成员名第二十三页,共51页。三、指向结构体数组的指针例1:

structstudentstu[3];

structstudent*p=stu;

p++;p++;

第二十四页,共51页。

structstudentstu[3];

structstudent*p;p=stu;

p->num;

p++;

p->num;

p++;

p->num;

第二十五页,共51页。三、用结构指针作函数的参数[例11.5]有一个结构体变量stu,内含学生学号、姓名和三门课程的成绩。要求在main中赋初值,在函数print中打印输出。运行第二十六页,共51页。说明:1、结构体的成员作函数的参数。与普通变量作函数参数的用法相同。值传送,不能修改实参的值。2、结构体指针作函数的参数。将结构体的地址传送给函数,效率高,可以修改实参的值。3、结构体作函数的参数。将结构体的全部成员值传送给函数,效率低,不能修改实参的值。第二十七页,共51页。四、举例

[例11.6]有4个学生,每个学生包括学号、姓名和成绩。要求找出成绩最高者的姓名和成绩。

返回本章目录运行第二十八页,共51页。§11.8共用体一、共用体的概念当需要把不同类型的变量存放到同一段内存单元,或对同一段内存单元的数据按不同类型处理,则需要使用“共用体”数据结构。例、把一个整型变量、一个字符型变量、一个实型变量放在同一个地址开始的内存单元中。共用体的定义形式:

union共用体名

成员列表;

}变量列表;例、第二十九页,共51页。uniondata

{

inti;

charch;

floatf;

}第三十页,共51页。注意区分:“共用体”:各成员占相同的起始地址,所占内存长度等于最长的成员所占内存。“结构体”:各成员占不同的地址,所占内存长度等于全部成员所占内存之和。第三十一页,共51页。二、共用体变量的引用只能引用共用体变量的成员,如、

uniondataa;

a.i;

a.ch;

a.f;第三十二页,共51页。三、共用体类型数据的特点1、共用体变量中的值是最后一次存放的成员的值,如:

a.i=1;

a.ch='a';

a.f=1.5;

完成以上三个赋值语句后,共用体变量的值是1.5,而a.i=1和a.ch=‘a’已无意义。第三十三页,共51页。2、共用体变量不能初始化,例、

uniondata

{

inti;

charch;

floatf;

}a={1,'a',1.5};第三十四页,共51页。

[例11.11]设有若干个人员的数据,其中有学生和教师。学生数据包括:姓名、号码、性别、职业、班级。教师数据包括:姓名、号码、性别、职业、职务。如图、

分析:学生数据的class(班级)和教师数据的position(职务)类型不同,但在同一表格中,使用“共用体”数据结构。运行第三十五页,共51页。§11.9枚举类型如果一个变量只有几种可能的值,可以定义为枚举类型。“枚举”:将变量可能的值一一列举出来。变量的值只能取列举出来的值之一。第三十六页,共51页。用关键字enum定义枚举类型:例、enumweekday{sun,mon,tue,wed,thu,fri,sat};weekday是枚举类型名,可以用于定义变量,如、enumweekdayworkday,week_end;

weekday=mon;

week_end=sun;sun、mon、....、sat称为“枚举元素”或“枚举常量”。第三十七页,共51页。说明:1、枚举元素是常量。在C编译器中,按定义的顺序取值0、1、2、...。

例、

weekday=mon;

printf("%d",weekday);输出整数1。2、枚举元素是常量,不是变量,因此不能赋值。

sun=0;mon=1;但在定义枚举类型时,可以指定枚举常量的值,如、

enumweekday{sun=7,mon=1,tue,wed,thu,fri,sat};此时,tue、wed、...的值从mon的值顺序加1。如,tue=2。第三十八页,共51页。3、枚举值可以作判断,例、

if(weekday==mon)....

if(weekday>sun)....4、整型与枚举类型是不同的数据类型,不能直接赋值,如、

workday=2;/*workday是枚举类型*/但可以通过强制类型转换赋值,如、

workday=(enumweekday)2;第三十九页,共51页。[例11.12]口袋里有红、黄、蓝、白、黑五种颜色的球若干个。每次从口袋中取出三个球,打印出三种不同颜色球的可能取法。

分析:球的颜色只可能取五种值,用枚举类型变量处理。

运行第四十页,共51页。§11.10用typedef定义类型一、概念关键字typedef用于定义一种新的数据类型,它代表已有数据类型,是已有数据类型的别名。例、

typedefintINTEGER;

typedeffloatREAL;

定义新数据类型INTEGER,它代表已有数据类型int。

定义新数据类型REAL,它代表已有数据类型float。通过上述定义后,以下两行等价:

int

i,j;floata,b;

INTEGERi,j;REAL

a,b;第四十一页,共51页。二、典型用法:1、定义一种新数据类型,专用于某种类型的变量,使程序更清晰明了。例1、typedefunsignedintsize_t

size_tsize;/*定义size为无符号整型变量*/例2、typedefintCOUNT

COUNTi,j;第四十二页,共51页。2、简化数据类型的书写。例3、typedefstruct

{

intmonth;

intday;

intyear;

}DATE;

DATEbirthday;

DATE*p;

DATEd[7];例4、typdefunsignedintUINT;

UINTi,j;第四十三页,共51页。三、定义新类型的更一般形式:(1)typedefintNUM[100];/*申明NUM为整型数组类型*/

NUMn;/*n为整型数组变量*/(2)typedefchar*STRING;/*申明STRING是字符指针类型*/

STRINGp,s[10];/*p是字符指针变量,s[10]是字符指针数组*/第四十四页,共51页。(3)typedefint(*POINTER)();

/*POINTER是指向函数的指针,该函数返回整型*/

POINTERp1,p2;/*定义p1,p2为指向函数的指针*/第四十五页,共51页。四、typedef与#define的区别

typedefintCOUNT

#de

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论