1、第7章 结构体与共用体第7章 结构体与共用体知识网络图 考点分析 7.1 概述数组只能存放一组类型完全相同的数据,无法实现对不同类型的一组数据的存放。因此需要使用结构体。结构体(structure)是一种数据类型,它把互相联系的数据组合成一个整体。例、一个学生的学号、姓名、性别、年龄、成绩、地址,是互相联系的数据,在C语言中用“结构体(structure)”来定义。struct student intnum; /* 学号 */char name20;/* 姓名 */ char sex; /* 性别 */int age; /* 年龄 */floatscore; /* 成绩 */char addr
2、30;/* 地址 */; struct student a,b;struct 是关键字,不能省略。student是定义的结构体类型名。结构体中的每一项数据,称为结构体“成员”。struct YG int bh;char xm20;float gz,jj,sf;struct YG x,y;7.2 结构体变量的定义结构体是一种数据类型(像int、char、float是数据类型一样),可以用它定义变量。用结构体类型定义变量的方式有两种:一、先定义结构体类型,再定义变量:struct 类型名 变量名;例:struct studentintnum; /* 学号 */char name20;/* 姓名 *
3、/char sex; /* 性别 */int age; /* 年龄 */floatscore; /* 成绩 */char addr30;/* 地址 */; struct student student1, student2;结构体变量中的各成员,在内存中顺序存放。结构体变量所占内存大小用运算符sizeof计算(结构体变量长度=所有成员长度之和)。 例:printf( %d %d n,sizeof(struct student), sizeof(student1);结果为:59 59二、在定义类型的同时定义变量(此时可省略类型名)struct studentintnum; /* 学号 */cha
4、r name20;/* 姓名 */char sex; /* 性别 */int age; /* 年龄 */floatscore; /* 成绩 */char addr30;/* 地址 */student1, student2; struct intnum; /* 学号 */char name20;/* 姓名 */char sex; /* 性别 */int age; /* 年龄 */floatscore; /* 成绩 */char addr30;/* 地址 */student1, student2;三、结构体类型的嵌套定义struct student intnum; /* 学号 */char nam
5、e20;/* 姓名 */char sex; /* 性别 */int age; /* 年龄 */struct date int year,month,day;birthday; /* 成员是另一个结构体变量 */char addr30;/* 地址 */ student1, student2; 7.3 结构体变量的引用1、结构体变量成员的引用方法结构体变量名.成员名 .是“成员运算符”例1:printf(%d,%s,%c,%d,%f,%s, student1.num, student1.name, student1.sex,student1.age, student1.score, sutdent
6、1.addr);printf(%d,%s,%c,%d,%f,%s, student1);是错误的。例2:student2.score = student1.score;sum = student1.score + student2.score;student1.age+;+student1.age;例3:scanf(%d, &student1.num); scanf(%s, student1.name); scanf(%d%s , &student1.num, student1.name);2、当结构体类型嵌套定义时,内层成员的引用例4:student1.birthday.month; stu
7、dent1.birthday.day; student1.birthday.year;3、仅在以下两种情况下,可以把结构体变量作为一个整体来访问结构体变量整体赋值例:student2 = student1; student2.num=student1.num; strcpy(student2.name, student1.name); student2.sex=student1.sex; student2.age=student1.age; student2.birthday.year=student1.birthday.year;取结构体变量地址: &student17.4 结构体变量的初始
8、化struct student long num; /* 学号 */char name20;/* 姓名 */char sex; /* 性别 */char addr20;/* 地址 */;struct student a=89031,Li Lin,M,123 Beijing Road,b=12121,Li ning,M, 123 xinfu Road; 7.5 结构体数组一、结构体数组的定义struct student int num;char name20;char sex;int age;float score;char addr30;struct student stu3; /*3个元素的
9、结构体数组 */二、结构体数组的初始化struct student int num;char name20;char sex;int age;float score;char addr30;stu3 = 10101,Li Lin, M, 18, 87.5, 103 Bejing Road, 10102,Zhang Fun,M, 19, 99, 130 Shanghai Roaad, 10104,Wang Min, F, 20, 78.5, 1010 Zhongshan Road ;三、举例例对候选人得票的统计程序。设有三个候选人,每次输入一个得票的候选人的名字,要求最后输出各候选人得票结果。#
10、define N 10#include stdio.h#include string.hstruct hxrchar name20; int count;a3=Li, 0,zhang,0,wang, 0;main() int i,j; char b20; for(i=1;i=N;i+) scanf(%s, b); if (strcmp(b,a0.name)=0) a0.count+;if (strcmp(b,a1.name)=0) a1.count+;if (strcmp(b,a2.name)=0) a2.count+; printf(n); for(i=0;i引用结构体中的成员:指针变量-成
11、员名p-num (*p).num stu_1.nump-name (*p).name stu_1.namep-sex (*p).sex stu_1.sexp-score (*p).score stu_1.score(*p).num方式几乎不用。注意:( ) . - 的优先级别并列第一 二、指向结构体数组的指针struct student stu3;struct student *p = stu; /* 指向stu0 */stui*(stu+i)pi*(p+i)三、举例例1 有4个学生,每个学生包括学号、姓名和成绩。要求找出成绩最高者的姓名和成绩。方法一:struct student int n
12、um;char name20;int score;main() struct student stu4,max;int i;for(i=0; i4; i+)scanf(%d %s %d, &stui.num, stui.name, &stui.score); max=stu0;for(i=1; i4; i+)if (max.scorestui.score) max = stui; printf(nmax:n);printf(No.: %dn name: %sn score: %dn,max.num,max.name, max.score);方法二:struct studentint num;
13、char name20; int score;main() struct student stu4,*p; int i; printf(ninput 4 students:); for(i=0; i4; i+) scanf(%d %s %d, &stui.num, stui.name, &stui.score);for(p=&stu0, i=1; iscorenum,p-name,p-score); 7.7 共用体一、共用体的概念共用体的定义形式:union 共用体名成员列表; ;a.w0a.w1union 共用体名 变量列表;union qqlong x;char w2;union qq a
14、;注意区分:“共用体”:各成员占相同的起始地址(有共处存储单元的特点,故称为共用类型),所占内存长度等于最长的成员所占字节数。“结构体”:各成员占不同的地址,所占内存长度等于全部成员所占字节数之和。二、共用体变量成员的引用 变量名.成员名 union datashort x; short y;a; 变量a的成员为: a.x a.y三、共用体类型数据的特点、共用体变量中的值是最后一次存放的成员的值,如:union datashort x; short y;a; a.xa.y0000 01110000 0000a.x=6;a.y=7;完成以上两个赋值语句后,a.x与a.y的值均是7。、共用体变量不
15、能初始化,例、union data int x;char y;a=6,7; 注意:1.共用类型数据长度的求解:长度等于最长的成员所占字节数。2.共用类型数据成员值的求解。例1:写出程序的运行结果:#include stdio.hmain() union datashort x; short y;a;a.x=3;a.y=4;printf(“%d”,a.x+a.y); 结果:8 例2:写出程序的运行结果:#include stdio.hmain()union datashort x; char w2;a;a.x=0x1213;printf(“%d,%d”,a.w0,a.w1);printf(“n%
16、x,%x”,a.w0,a.w1);a.xa.w00x13a.w10x12结果:19,18 13,12例3:写出程序的运行结果:#include stdio.hmain()union datashort x; char w2;a;a.w0=0x03;a.w1=0x01;printf(“%d,%d”,a.x,a.w0);a.xa.w00x03a.w10x01a.x=0x0103 a.w0=0x03结果为:259,3例4:写出程序的运行结果:#include stdio.hmain()union aa double x3;float y2;char w6;struct bblong x,y; uni
17、on aa z;char w2;a,b2;printf(“%d”,sizeof(a)+sizeof(struct bb)+sizeof(b);结果为:136 34+34+687.8 枚举类型如果一个变量只有几种可能的值,可以定义为枚举类型。“枚举”:将变量可能的值一一列举出来。变量的值只能取列举出来的值之一。用关键字enum定义枚举类型:例:enum weekday sun, mon, tue, wed, thu, fri, sat;weekday是枚举类型名,可以用于定义变量,如、enum weekday work, rest; 定义了两个枚举变量:work与rest, 它们只能取sun到s
18、at之一,如、 work= mon;rest= sun;sun、mon、.、sat称为 “枚举常量”。说明:1、枚举常量在编译器中,按定义的顺序取值0、1、2、.。例:work= mon;printf(%d,work); 输出整数1。2、枚举常量不能被赋值。sun = 0; mon = 1; 但在定义枚举类型时,可以指定枚举常量的值,如:enum weekday sun=6, mon=0, tue, wed, thu, fri, sat;此时,未指定值的枚举常量比前一枚举常量大1。如,tue的值为1。enum ww three=3,two,one=1; two为43、枚举值可以作判断,例:if
19、 (work = = mon).if (work sun).4、整型与枚举类型是不同的数据类型,不能直接赋值(在turbo C中例外),如、work = 2; /* work是枚举类型, 在turbo C中正确*/但可以通过强制类型转换赋值,如、work = (enum weekday)2; work=wed;5枚举常量必须是满足用户标识符的命名规则,不能是已存在的常量。如:enum ww 1,2,3,4;enum ww “aa”,“bb”,“cc”; enum ww a,b,c;例:#include stdio.hmain()int a5=100,200,300,400,500,s=0;en
20、um color red, yellow, blue, white, blacki;for(i=red; i=black; i+) s=s+ai;printf(“n%d”,s);结果为:15007.9 用typedef定义类型用户自定义类型是为了将已经存在的类型重新取一个新的名字,以便于书写。(1)对基本类型的自定义typedef unsigned long AA;AA x,y,a10,*p; 等价于unsigned long x,y,a10,*p;(2)对指针类型的自定义 typedef int *W; W p,q; 等价于 int *p,*q;(3)对结构类型的自定义typedef struct stuSTU; STU x,a4; 等价于 struct stu x,a4;typedef struct int month;int day;int year;DATE ;DATE birthday,*p,d7; 等价于structint month;int day;int year; birthday,*p,d7;(4)对数组类型的自定义 typedefdouble BB10;BB x,y; 等价于 double x10,y10;
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1