第05章复杂构造数据类型

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

char sex;
int age;
struct birth birthday;
float score;
char addr[20];
} stu1;
11
(4)结构体变量的初始化
➢ 可以在定义结构体变量的同时, 对其初始化
例:struct student
相当于:
{ long int num; char name[20]; char sex; char addr[20];
(*p).score=89; /*相当于:stu1.score=89; */
16
➢ 3种引用结构体成员的方法 ⑴ 结构体变量.成员名 ⑵ (*p).成员名 ⑶ p->成员名
分析以下几种运算符: p->n p->n++ ++p->n *p.num(错误!)应改为:(*p).num
17
2.指向结构体数组的指针
char sex; printf(“%d,%c”,stu1.num,stu1.sex);
int age;
struct birth birthday;
float score;
char addr[20];
} stu1;
9百度文库
结构体变量使用说明:
➢ 结构体变量通常不能整体使用,不能整体输入、输出, 只能对单个成员分别引用。
} stu1, *p;
p=&stu1;
(*p).num=89101;
/*相当于:stu1.num=89101;*/
strcpy((*p).name,"Li Lin"); /*相当于: strcpy(stu1.name,“ Li Lin");*
(*p).sex='M'; /*相当于:stu1.sex='M'; */
15
5.1.4 结构体与指针
➢ 1.指向结构体变量的指针
struct student { long num;
char name[20]; char sex; float score;
注:
(1)此处*p相当于结构体变量 (2)(*p).表示成员引用,( )不能省略,因 为成员运算符优先级最高。
(3)可以用指向运算符来引用成员,例 如可以用p->num来代替(*p).num
例3: union { int i;
char ch; float f; } aa,bb,cc;
23
共用体变量所占的内存空间
共用体变量所占内存的长度等于最长 的成员的长度。而不是各成员的长度之和, 这一点不同于结构体。
例如前面的例子data类型的变量aa, 占据的内存空间为4个字节,而不是 2+1+4=7个字节。
p
10101
struct student
Li Lin
stu[0]
{ int num; char name[20]; char sex;
p++后指向 什么位置?
M 87.5 10102 Zu Feng F
stu[1]
float score;
98
}; struct student stu[3], *p; …… for(p=stu;p<stu+3;p++)
7
➢ 定义了结构体变量后,系统为之分配内存单元,结构 体的各成员在内存中是按顺序连续存放的,所以结构 体变量在内存中占据的字节数是各个成员的长度和。 可用求类型长度运算符求出 sizeof(类型名) 如:sizeof(int)为2 sizeof(struct worker)为61;
➢ 定义结构体变量必须指明具体的类型名,不同于定义 int等标准数据类型变量,因为不同的结构体类型具有 不同的结构组成。

姓名 周炎 王林 丁鹏 李娟

语文 78 87 65 68 …
数学 62 73 85 82 …
英语 67 86 93 81 …
总分 207 246 243 231 …
在一条记录中既有整型数据(学号、分数等),又有字符串(姓名), 像这样的数据是由几种不同类型的数据构成,是不能用前面学过的数组来表 示的,因为数组的各个元素都是相同的数据类型。按照以前所学的数据类型 是无法处理这种复杂数据的。
例: struct student { int num; char name[20]; char sex; float score; char addr[20]; };
struct student stu[40];
struct { int num;
char name[20]; char sex; float score; char addr[20]; }stu[40];
➢ 在为结构体变量分配存储空间时,ch每ar个na结me构[2体0];变量所 占存储空间大小为其成员所占存储ch空ar间se的x;总和。
int age; char branch[20];
➢ 结定义构该体类类型型在变使量用,之才前能应使先用定。义其ffflll类oooaaattt型bipn结aosynu;u构rsa;n,ce然; 后再
× struct w1,w2;
8
(3)结构体变量的引用
➢ 一般来说, 在程序设计中不直接引用结构体变量,而 是引用结构体变量的某个成员变量。
➢ 成员的引用形式: 结构体变量名.成员名
struct student
{
stu1.num=9002;
int num;
gets(stu1.name);
char name[10s]t;u1.sex='m' ;
➢ 能否设计一种新数据类型,使属性相同的成员在同一 结构里,而属性不同的成员随机可用?
➢ C语言提供了一种新的结构类型——共用体类型,可 以解决这个问题。
20
1. 共用体的概念
所谓“共用体”类型, 是指使几个不同类型的 变量共同占用同一段内存单元。
21
2. 共用体的定义
union 共用体类型名
{
13
结构体数组各元素在内存中是连续存放的, 各元素的成员也是按顺存放的。
num Stu[0] 10101 Stu[1] 10102 Stu[2] 10103
name Li Lin Zu Feng Wang Mi
…… ……
sex score addr M 87.5 103 Beijing
F 98
130 Shanghai
a.num=9001; strcpy(a.name, “曹名”);
a.sex=‘m’; strcpy(a.addr, “123 北京路” );
}a={9001,"曹名",'m', "123 北京路" };
12
5.1.2结构体数组的引出及使用
➢ 结构体数组中每一个数组元素都是一个结构体类型的 数据,它们都分别包括各个成员项,例如一个班级的 40名同学信息组成的数组,每一个同学的数据都是一 个结构体类型。
复杂构造数据类型
➢ 结构体 ➢ 共用体 ➢ 枚举类型
1
引入
➢ 对于同种类型的数据可以用数组来描述。 ➢ 在解决实际问题时,有时需要将多个不同数据类型的
数据组合在一起表达一个整体的信息。如学生个人信 息,包括姓名、学号、年龄等,就包含了字符数组和 整型数据。
2
结构体
➢ 学生成绩表
学号 1001 1002 1003 1004
24
3. 共用体变量的引用
共用体变量只能引用它的成员,不能引用共用体变量 本身。
共用体变量.成员名
例如前例中的变量aa,可以引用它的成员 aa.i=56; aa.f=123.6432; aa.ch=‘A’;
M 78
104 Jinan
14
结构体数组的初始化
例 struct student { int num; char name[20]; char sex; float score; char addr[20]; }stu[3]={ {10101,”Li Lin”,’M’,87.5,”103 Beijing”}, {10102,”Zu Feng”, ’F’,98,”130 Shanghai”}, {10103,”Wang Mi”,’M’,78,”104 Jinan”} };
例如:
struct birth
{ int
month; int day; int
year; };
struct student
{
stu1.birthday.month=4;
int num;
stu1.birthday.day=5;
char name[10];
stu1.birthday.year=1998;
struct worker {
int num; char name[20]; char sex; int age; char branch[20]; float pay; float bonus; float insurance; float realpay; };
5
注意:
➢ 结构体类型的定义并共占没2有+2在0+1内+2存+2中0+为4+其4+4分+4配=6空1个间字,节仅 仅定义了数据的组织形式,创立了一种数据类型,可 以理解为以前学过的int、char等基本数据类型。只有 在量定分义配了空结间构。体类型的变量后,s{才tinr会tucnt在umw内o; r存ker中为该变
例1:
类型标识符1 成员名1; union data
类型标识符2 成员名2; { int i;
….. …….
char ch;
类型标识符n 成员名n; float f;
};
}aa,bb,cc;
共用体类型的变量声明形式也有3种,同结构体类 型。
22
例2: union data { int i;
char ch; float f; }; union data aa,bb;
10103 Wang Mi M 78
stu[2]
printf(“%d,%s,%c,%f”,p->num, p->name,p->sex,p->score);
注意:p是指向结构体数组的元素的,不能用来指向数组元素中 的某一成员,如 p=&stu[1].num 是错误的。
18
5.3 共用体
➢ 在某些实际问题中,所定义的两个结构体类型中只有 一个或很少数的成员不同,其它大部分成员都是一样 的,这样如果使用两类结构,会发现有大部分的程序 代码是重复的。
类型名n 成员名表n;
};
注意此处“;”
不能省略
(1)结构体类型用struct 关键字定义
(2)花括号里的每一项称 为结构体成员
(3)结构体成员的类型可 以是普通的数据类型(如int、 char等),也可以是数组、 指针或已经定义的结构体等 任意的数据类型。
4
例如:职工的基本信息有以下几部分组成:编号、姓名、性别、 年龄、班组、基本工资、奖金、保险、实发工资。 分析:可以将每个工人的信息定义为一个结构体类型,设类型名 是worker
float realpay; };
6
(2)定义结构体类型变量的方法
注意:不出 现类型名
➢ 前面定义的worker同int、char等一样只是类型的名
字,不是结构体变量,不能直接使用,需由此类型继
➢也 还注例可可续步意:以以骤定:s在直t:义s关rt定接u结先r键cu义定t构定c字t类义体义结st型结w变一构rou的构量个r体ckt同体才结e类与r时变能构型结定量使体名w构义用类1体,结。型变w类构s{},量w2ticcicffffs{}nn型rw1tllllhhh体,iccicffff再oooott名unn,r1aaallllhhhwaaaacoooottu标,narrraaa变wwtttt2t定aaaac列gunarrrnbstttt2,tpbriem[wg识uwnea量rnbse,5义a;opirbem表ows;mx[anearayena;o50ru符ns;;mx[al;。eayun变kpr50;uc]n;l[;seueaa;prh0]c一2;[sn;rya量a[h]20;c2;n;y[起0]ec2;0;。];e0];使;;]; 用。
为了解决这种问题,C语言将几种不同类型的数据组合到一起,这就是 我们下面要介绍的结构体类型。
3
5.1.1 结构体的引出及使用
➢ (1)结构体的定义: 由若干个不同类型的数据项组成的组合类型,在C语言 中叫做结构体类型。
格式:
struct 结构类型名
{
类型名1 成员名表1;
类型名2 成员名表2;
……
➢ 但当结构体变量作为函数参数或赋初值时,可以整体 使用;或者两个相同类型的结构体变量,如果一个已 经赋值,可以对另外一个整体赋值。
如果student1已被赋值,则可以: student2=student1;
10
➢ 结构体成员也可以是另一个结构体变量,如前面的 birthday成员本身又是birth类型的结构体变量,这 个成员也不能整体赋值,要用若干个成员运算符引用。
相关文档
最新文档