h第八章结构和联合_第1页
h第八章结构和联合_第2页
h第八章结构和联合_第3页
h第八章结构和联合_第4页
h第八章结构和联合_第5页
已阅读5页,还剩7页未读 继续免费阅读

下载本文档

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

文档简介

1、第8章结构和联合 8.1 结构(structure) 8.1.1结构类型 由若干个成员(域)组成。 每个成员具有自身的名字和数据类型, 同一结构中的成员名不能相同。 例如,一个学生的信息,它包括以下5项: 学号、姓名、性别、年龄、成绩 8.1.2结构类型的定义 一般形式: 结构名 struct 类型 类型 成员名 成员名 1; 2; 例如: struct student 类型 ; 成员名 n; long int num; char name20; char sex; int age; float score; IP 开始 结果 连盂 运行 (类似于int, char 样的作用) 说明: (1)

2、 结构定义描述了结构的组织形式,但在编译时并不分配存储空间 (2) 结构的成员可以是简单变量、数组、指针、结构等。 struct date /*struct32个关键字之一 */ int day; char month4; int year; ; struct stud long num; char name20; char sex; struct datebirthday; 嵌套结构stud的逻辑结构 char *addr; ; (3) 结构定义可在函数内部,也可在函数外部。 定义结构类型时,注意不能遗漏最后的分号。(表示一个类型定义语句) 8.1.3结构变量 、结构变量的声明 三种定义方法

3、 1. 在定义结构类型的同时声明变量。例如: struct stude nt long num; char n ame20; char sex; int age; float score; s1,s2,s3; 2. 直接声明结构类型变量 例如: struct long num; char n ame20; char sex; int age; float score; s1,s2,s3;/* (这里不同于前一种方法之处在于struct后面不出现结构名,故不便于在源程 序中的其他地方声明新的变量)*/ 3. 先定义结构类型再声明变量 例如: struct stude nt long num; c

4、har n ame20; char sex; int age; float score; ; struct stude nt s1,s2,s3; 注意: 先定义类型再声明变量。 (1) 存储空间分配是按照各成员项的 定义顺序进行的。 每个结构变量存储空间的大小是 各成员项所占空间之和。例如: sizeof( s1 的值为 31; 4+20+1+2+4 sizeof( struct student )的值为 31 ; sizeof( float )的值为4。(sizeof长得像函数但其实是一个单目运算符,运算量可以是简单变量名、数组名、结构变量 名、数据类型名等) (4) 结构变量中的成员 可单

5、独使用。 二、结构变量的初始化 struct stude nt long num; char n ame20; char sex; int age; float score; s1,s2=80101,Lilin,M,18; J对 S进行初始化,没有注出的部分默认为0 三、结构变量的引用 形式: 结构变量名.成员名 叫做成员运算符,用于访问结构变量的成员,优先级为第一优先级 mai n() struct stude nt long num; char n ame20; char sex; int age; s1,s2=80101,Lili n,M,18; prin tf( %ldn%sn %,

6、s2.n um,s2. name,s2.sex); s1=s2; /*结构变量还加值传值*/ prin tf( %ldn %sn % ,s1. nu m,s1. name,s1.sex); float score; 注意: (1)不能将一个结构变量作为一个整体进行输入和输出 例:scanf(%ld%s%c, printf(%ldn %sn %cn,s2); 只能对各个成员分别进行输入和输出,如: s1.num=80101; strc py (,Liling); (2)结构变量可以进行整体赋值,但不能整体进行比较 if(s1s2) P rintf(%s,); stu0

7、 (3)如果成员本身又属一个结构类型,则要 逐级地找到最低的一级成 stu2 stu3 stu4 8.2结构数组 8.2.1结构数组的声明 1.定义结构类型后声明结构数组。例如: struct stude nt long num; char n ame20; char sex; int age; float score; ; struct stude nt stu5; LT 厶 hvT-U 曰 ZE AA lP* 、井 员 o 只能对最 低级的成员进行 存取o n ame sex age score num 结构数组的逻辑结构 2. 直接声明一个结构数组 例如: struct stude nt

8、 long num; char n ame20; char sex; int age; float score; stu5; 或 struct long num; char n ame20; char sex; int age; float score; stu5; 8.2.2结构数组的初始化 格式: struct结构名结构数组名元素个数=初始数据 struct stude nt stu3=80101, Lili n, M, 18, 80102,Wa ngla rr,F,19, 80103,Zha ngjun ”,F,20; 8.2.3结构数组元素的引用 形式: 结构数组名下标.成员名 例如

9、printf( “ ld ” , stu0.num); strcpy(stu0. name,Lili n); 8.3结构指针 8.3.1指向结构变量的指针 形式: 例: 再例: struct struct struct 结构名 *结构指针名; stude nt *p; stude nt num; long char n ame20; char sex; int age; float score; s1, * p= 用指针引用结构成员的一般形式: (*结构指针名).成员名 结构指针名- 成员名 设有 struct date int day; char mon th4; int year; bir

10、thday,*s p= 注意: (1) (*sp).day 中*sp两侧的括号不可省; 如果省,则*sp.day等价于*(sp.day) 由于运算符-”、“.、”“()和“啲优先级最高。例如: +Sp-day 等价于 +(s p-day) (+s p)-day sp+-day 等价于(sp+)-day sp-day+ birthday。day等价于(*sp)。day等价于sp-day等价于 ( char n ame20; char sex; int age; stu3=80101,Li lin ”,M,18, 80102,Ya ngla rr,F,19, 80103,Zha ngjun ”,F

11、,20; void mai n() struct stude nt *p; for(p=stu; pnum,p-n ame, p-sex, p-age); 8.3.3结构变量作函数参数 1. 用结构变量的成员作参数 女口,用stu0.num作实参,将实参传给形参,采用值传递”。 2. 用结构变量作实参 采用 值传递”,将其所占内存的内容全部顺序传给形参。 3. 用结构变量的地址 作参数 采用地址传递”,将其首地址传给形参。 例如:以下程序的运行结果是:10, x struct n int x; char c; ; main () struct n a=10,?x?; fun( a); prin

12、tf( “ d,%c” fun (structn b) b.x=20; b.c=,y?; 例如: static int x3=4, 5,6; ,a.x, a.c); n ame count struct ss int *y; char c; StU3t struct ss *p=stu; 1. *p y 2. 3. 4. P y+ (*p y)+ P+ y 4 1 5 2 6 3 曲卩Jy 41 8.4 例: 终的得票结果。 结构数组应用举例 统计候选人得票。设有 3个候选人,要选一人当班长。输入得票的候选人名字,输出最 struct person char n ame20; int coun

13、t; leader3= “ Li ” ,0,“ Zhang ” ,0,“ Wang ,0; #i ncludestri ng.h mai n() int i,j; char n ame20; for (i=1;i=10;i+)/* 十人投票 */ scanf(%s,name);/* 输入投票结果 */ for(j=0;j3;j+) /* 三人中 */ if( strcmp(name, )=0 ) /*对比投票结果(姓名)和候选人的姓名, 如果一样(=0) */ leaderj.count+;/*这个候选人的票数增加一票*/ for(i=0;i3;i+) printf(

14、n“-6s:%2d, , leaderi.count ); 例如:找到年龄最大的人,并输出。 #defi ne N 4 struct man char n ame20; int age; ,20,“ sun ” ,22; personN=“ li ” ,18, “ wang” ,19,“ zhang ” mai n() struct man *q,* p; int m=0; for (p=person; pvperson+N; p+) if( m age ) q=p; m=q-age; prin tf( %s,%d,(*q) .n ame,(*q).age); 8.5

15、联合(union)。 是一种构造型数据类型,允许不同类型和不同长度的数据共享 定义的一般形式: union 联合名 类型 类型 leader2 n ame cou nt L 0 壬同一块存储空间 .0 Wang 0 成员名 成员名 1; 2; 成员名 n; 类型 ; 例: union data int i; char ch; float f; a,b; union data int i; char ch; float f; ; union data a,b; 或 union int i; char ch; float f; a,b; I变量,b各占4个字节 8.6 枚举(enumeration

16、) 概念 列举出所有可能的取值的一种数据结构。 定义 enum枚举名枚举元素1,枚举元素2,,枚举元素n; 女0: enum weekdaysun, mon, tue, wed, thu, fri, sat; enum weekday workday; 或:enum weekdays un,mon ,tue,wed,thu,fri,satworkday; 或:enum sun,mon ,tue,wed,thu,fri,satworkday; 枚举变量的赋值和使用 枚举值是常量,不是变量; sun=5; mon=2; sun=mon; 均是错误的。 枚举类型是有序数据类型; 如: mai n()

17、 enum weekday sun,mon ,tue,wed,thu,fri,sata,b,c; a=s un; b=mon; c=tue; printf(“ d,%d,%d” ,a,b,c); 运行结果为:0, 1,2 可改变枚举元素的值; enum weekdays un=7, mon=1,tue,wed,thu,fri,satworkday; 枚举元素可比较; 如默认时:mo nsun (1) (5) 只能将枚举值赋予枚举变量 女0: a=sUh; b=moh;是正确的 而 a=0; b=1;是错误的 但 a=(e hum weekday)1正确 (6) 枚举元素不是字符串常量,使用时不要加引号 (7) 程序中可使用常数的地方,都可以使用枚举常量。如: ehum color red, gree h, yello

温馨提示

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

评论

0/150

提交评论