结构体共用体与枚举类型-西安交大.ppt_第1页
结构体共用体与枚举类型-西安交大.ppt_第2页
结构体共用体与枚举类型-西安交大.ppt_第3页
结构体共用体与枚举类型-西安交大.ppt_第4页
结构体共用体与枚举类型-西安交大.ppt_第5页
已阅读5页,还剩31页未读 继续免费阅读

下载本文档

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

文档简介

9.1 结构体 9.2 结构体数组 9.3 结构体与指针 9.4 共用体 9.5 枚举类型 9.6 用typedef定义类型,第9章 结构体、共用体与枚举类型,9.1 结构体,结构体是将不同类型的数据根据需要组合成一个有机的整体,以便于引用。 这个整体是一个构造数据类型结构体类型,其中的数据是相互联系的。 如要存储一个学生的有关信息(学号、姓名、性别、年龄、住址),可采用结构体数据结构描述上述信息。,struct student int num; char name20; char sex; int age; char addr30; ;,定义一个结构体类型的一般形式为:,struct 结构体名 成员表列;,是类型,不是变量名,对各成员都要进行类型说明; 成员名命名规则与变量名,定义结构体类型变量的方法,方法一:先定义结构体类型再定义变量 struct student int num; char name20; char sex; int age; char addr30; ; struct student student1, student2;,定义studet1和 sudent2为 struct student 类型变量,不能只指定一个变量为“struct型”而不指定结构体名,可用符号常量代表一个结构体类型,#define STUDENT struct student STUDENT int num; char name20; char sex; int age; char addr30; ;,这样,可直接用STUDENT 定义变量,如: STUDENT student1, student2; 此时,不必再写关键字struct,方法二:在定义类型的同时定义变量,struct student int num; char name20; char sex; int age; char addr30; student1, student2;,一般形式是: struct 结构体名 成员表列 变量名表列;,方法三:直接定义结构类型变量,其一般形式是: struct 成员表列 变量名表列;,此时,不出现结构体名,struct int num; char name20; char sex; int age; char addr30; student1, student2;,几点说明:,1.类型与变量是不同概念,不要混淆; 2.结构体中的成员,可以单独使用,其作用与地位相当于普通变量; 3.成员名可以与程序中的变量名相同,二者不代表同一对象。互不干扰。 4.在结构中,各成员都占有自己的内存空间,它们是同时存在的。一个结构变量的总长度等于所有成员长度之和。,Sizeof( )为一运算符,其功能是测试某种类型的变量在内存中所占用的字节数。,有: struct int i; char c; float a; test; sizeof(test)的值是:7,struct date int month; int day; int year; ; Struct student int num; char name20; int age; struct date birthday; student1,student2;,Struct student int num; char name20; int age; struct int month; int day; int year; birthday; student1,student2;,5. 成员也可以是一个结构体变量。例:,结构体类型变量的引用,引用一般形式为:结构体变量名.成员名 规则: 1. 不能将一个结构体变量作为一个整体进行赋值和输出;只能对其各个成员分别输出。 printf(“”,student1); printf(“ %d”, student1.num); 输出 10010,错!,正确!,2 .若成员本身又属一个结构体类型,只能对最低级的成员进行赋值或存取以及运算。 如:student1.birthday.year,3. 对成员变量可以象普通变量一样进行各种运算,如: sumage=student1.age+student2.age; 4. 可以引用成员的地址,也可以引用结构体变量的地址,如: scanf(“%d”,错!,输入student1.num的值,输出student1的首地址,Struct student int no; char name20; char sex; struct int year; int month; int day; birth; ; Struct student s;,设变量s中的“生日”是“1984年11月11日”,下列对“生日”的正确赋值方式是: A)year=1984;month=11;day=11; B)birth.year=1984;birth.month=11;birth.day=11 C)s.year=1984;s.month=11;s.day=11 D)s.birth.year=1984;s.birth.month=11;s.birth.day=11;,练习:已知学生记录描述为:,结构体变量的初始化,在定义结构体类型变量的同时对其每个成员赋初值初始化。 struct student long int num; char name20; char sex; char addr20; a=9801,”Wang hong”,W,”2 Linggong Road”; main( ) printf(“No.:%ldnname:%snsex:%cnaddress:%sn”,a.num,,a.sex,a.addr);,运行结果为: No.:9801 name:Wang hong sex:W address:2 Linggong Road,9.2 结构体数组 (每个数组元素都是一个结构体类型的数据),结构体数组的定义: struct student int num; char name20; char sex; int age; char addr30; ; struct studnt stu3;,也可直接定义: struct student int num; stu3; 或struct int num; stu3;,结构体数组的引用,1结构体数组元素中某一成员的引用 表示stu的第1个元素的name成员项 stu4.age 表示stu的第5个元素的age成员项 2结构体数组元素的赋值 可将一个结构体数组元素赋给同一结构体数组中的另一个元素,或者赋给同一类型的变量。 stu1 = stu2; Stu4 = stu5; 注意:结构体数组元素的输入和输出只能将单个成员项进行输入和输出,而不能把结构体数组元素作为一个整体直接进行输入和输出。,结构体数组的初始化,struct student int num; char name20; char sex; int age; char addr30; stu3=111,”Li”,M,18,”Dalian”,; 也可采用:struct student int num; ; struct student stu=,;,结构体数组的初始化的一般形式是在 定义数组后面加上: =初值表列;,struct person char name20; int count; leader3=“Li”,0,”zhang”,0,”Liu”,0; main( ) int i, j; char leader_name20; for( i=1;i=10;i+) scanf(“%s”,leader_name); for(j=0;j3;j+) if(strcmp(leader_name,)= =0)leaderj.count+); for(i=0;i3;i+) printf(“%5s:%dn”,,leaderi.count); ,判断是哪一位候选人,例题:设有三个候选人,每次输入一个得票的候选人的名字,要求最后输出各人得票结果。,计算学生的平均成绩和不及格的人数。,struct stu int num; char *name; char sex; float score; boy5= 101,“Li ping“,M,45, 102,“Zhang ping“,M,62.5, 103,“He fang“,F,92.5, 104,“Cheng ling“,F,87, 105,“Wang ming“,M,58, ;,main() int i,c=0; float ave,s=0; for(i=0;i5;i+) s+=boyi.score; if(boyi.score60) c+=1; printf(“s=%fn“,s); ave=s/5; printf(“average=%fncount=%dn“,ave,c); ,9.3 结构体与指针,结构体变量的指针是该结构体变量所占据的内存段的起始地址 如: main( ) struct student long int num; char name20; char sex; ; struct student stu_1; struct student *p; p=&stu_1;,stu.num=9901; strcpy(stu_1.name,”Li Min”); stu_1.sex=W; printf(“No.:%ldnname%snsex:%cn”, stu_1.num,stu_1.name,stu_1.sex); printf(“nNo.:%ldnname%sn sex:%cn”,(*p).num,(*p).name,(*p).sex); ,指针的定义,引用结构体成员的三种形式: 结构体变量名 . 成员名 (*p).成员名 p- 成员名,指向运算符。其优先级高于自增、自减运算符,试分析以下运算: p-n 得到p指向的结构体变量中的成员n的值 p-n+ 得到p指向的结构体变量中的成员n的值, 用完后使它加1; +p-n 得到p指向的结构体变量中的成员n的值 使其先加1,成员运算符,指向结构体数组的指针,类似与多维数组中指向一维数组的指针。例: #include“string.h“ #include“stdio.h“ struct student int num; char name20; char sex; int age; ;,struct student stu3=10101, “Li Lin“, M, 18, 10102, “Zhang Fun“, M, 19, 10104, “Wang Min“, F, 20; void main() struct student *p; printf(“ No. Name Sex agen“); for (p=stu; pnum, p-name, p-sex, p-age); 注意:p定义为struct student类型,它只能指向这种类型的结构体变量,而不能指向该类型的成员(p=&是错误的)其它类型的结构体变量。,用结构体变量和指向结构体的指针作为函数参数,将一个结构体变量的值传递给另一个函数有3个方法: 用结构体变量的成员作参数,将实参值传给形参 用法和用普通变量作实参是一样的,属于“值传递”方式。应当注意实参和形参的类型保持一致。 2.用结构体变量作实参 此方法采用的是“值传递”的方式,将结构体变量所占的内存单元的内容全部顺序传递给形参。形参也必须是同类型的结构体变量。在函数调用其间形参也要占用内存单元。这种传递方式在空间和时间上开销较大。此外,由于采用值传递方式,如果在执行被调用函数其间改变了形参(也是结构体变量)的值,该值不能返回主调函数,这往往造成使用上的不便。因此一般较少用这种方法。 3.用指向结构体变量(或数组)的指针作实参,将结构体变量(或数组)的地址传给形参。,#include“stdio.h“ #define format “%dn%sn%fn%fn%fn“ struct student int num; char name20; char sex; float score3; ;,void main() void print(); struct student stu; stu.num=12345; strcpy(, “Li Li“); stu.score0=67.5; stu.score1=89; stu.score2=78.6; printf( ,void print(p) struct student *p; printf(format, p-num, p-name, p-score0, p-score1, p-score2); printf(“n“); ,9.4 共用体,共用体是使用覆盖技术将几个不同类型的变量置于同一段内存,虽然它们各自占的内存长度不同,但起始地址相同。 共用体定义的一般形式: union 共用体名 成员表列 变量表列; 结构体和共用体机制上的区别: 结构体所占内存长度是各成员占的长度之和。即每个成员分别占有其自己的内存单元。共用体变量所占内存长度是最长的成员的长度。,例如: union a int i; char ch; float f; a, b, c;,已知: union int i; char c; float a; test; 则:sizeof(test)的值是:4,共用体数据的特点,1)同一个内存段可以用来存放几种不同类型的成员变量,但在每个瞬间只能存放其中一种,而不是同时存放几种。起作用的是最后依次存放的成员。如经过以下三次赋值后,只有a.f=1.5有效。 a.i=1; a.ch=a; a.f=1.5; 2)共用体变量的地址和它的各成员的地址都是同一个地址 3)不能对共用体变量名赋值。也不能企图引用变量名得到成员值,不能在定义共用体变量时对它初始化。下面是错误的: (1) union int i; char ch; float f; a=a, a, 1.5; (2) a=1; (3) m=a;,4)在函数间传递共用体时,只能使用指针的方法。 5)共用体类型可以出现在结构体类型定义中,也可以定义共用体数组。反之,结构体也可以出现在共用体类型定义中,数组也可以作为共用体的成员。 要作如下表格的数据管理,对教师(“T”)要注明职务(“position”),对学生(“S”)要注明班级(“class”)。由于数据的不完全一致,对班级和职务要用到共用体。,struct int num; char name10; char sex; char job; union int class; char position10; category; person2;,main() int n, i; for (i=0; i2; i+) scanf(“%d %s %c %c“, ,printf(“n“); printf(“No. name sex job class/positionn“); for (i=0; i2; i+) if (personi.job=s) printf(“%-6d%-10s%-3c%-3c%-6dn“, personi.num, , personi.sex, personi.job, personi.category.class); else printf(“%-6d%-10s%-3c%-3c%-6sn“, personi.num, , personi.sex, personi.job, personi.category.position); ,9.5 枚举类型,如果变量只有几种可能的值,可以定义为枚举类型。它是把变量的值一一列举出来。变量只能取列举出的值。 枚举类型定义一般方法: enum weekday sun, mon, tue, wed, thu, fri, sat; 变量声明方法: enum weekday workday, week_end; workday和week_end被定义为枚举变量,它们只能取值于sun到sat之一。如: workday=mon; week_end=sum; 是正确的。,1在C编译中,对枚举按常量处理,故称枚举常量。不能对它们赋值。例如: Mon = 1; Sun = 7; 是错误的。 2枚举元素作为常量,它们是有值的,如果没有进行初始化,第一个枚举元素的值是0,第二个枚举元素的值为1,依此类推。例如,对上述枚举变量wordkay来说,如下语句: workday = Fri;printf(“%d”,workday); 输出结果是4。 也可以改变枚举元素的值,在定义时由程序指定,例如: enum weekday Mon = 1,Tue,Wed,Thu,Fri,Sat,Sun workday; 定义Mon为1,以后顺序加1,Sun为7。 3枚举类型变量只能取枚举元素表中的某个元素,而不能是其它值。不能把整数直接赋给枚举变梁。例如:workday = 2 ;是错误的。它们属于不同的类型。应先进行强制类型转换才能赋值。例如:workday = (enum weekday) 2;甚至可以是表达式。例如:workday = (enum weekday) (5-3); 4枚举值可以用来作判断比较。例如:if (workday = Mon) 枚举值的比较规则是:按其在定义时的顺序号比较。顺序号大,枚举值也大。如果workday = Fri,那么workday就大于Tue。,枚举类型的变量在使用时要注意以下几点:,例:已知今天是星期日,编写一个程序,求若干天后是星期几。,#include void main() int n; enum sun,mon,tue,wed,thu,fri,sat day; char weekday77 = “星期日“,“星期一“,“星期二“, “星期三“,“星期四“,“星期五“,“星期六“; printf(“输入间隔天数:“); scanf(“%d“, ,9.6 用typedef定义类型,C语言允许用typedef说明一种新的类型名,新的类型名即可当做原类型标识符来使用,用它来定义变量,其一般形式为: typedef 其中,typedef是类型定义关键字;原类型标识符指的是已有的类型标识符,如int、float、已定义过的结构体、共用体、枚举等;新类型标识符是用户自行定义的标识符,用来代替原类型标

温馨提示

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

评论

0/150

提交评论