四川大学《c语言程序设计》课件-第8章 结构体与共用体
合集下载
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
struct 结构体名 {
类型关键D字on’t f成or员ge名t 1th;e
类型关键字semi成co员lo名n2!!;
…... 类型关键字 成员名n; };
形成一个样板 用于生成结构体变量
构成结构体的变量 称结构体成员(member) 也称域(filed)
struct student {
int num; char name[20]; char sex; int age; float score; char addr[30]; };
char studentSex[4]; /*每个学生的性别*/
int timeOfEnter; /*每个学生的入学时间*/
int scoreComputer; /*每个学生的计算机原理成绩*/
int scoreEnglish; /*每个学生的英语成绩*/
int scoreMath;
/*每个学生的数学成绩*/
char
studentSex[4];
struct date timeOfEnter;
int
scoreComputer;
int
scoreEnglish;
int
scoreMath;
int
scoreMusic;
};
初始化
struct STUDENT stu[30] = {{1,"令狐冲","男",{1999,08,26},90,83,72,82}, {2,"林平之","男",{1999,08,26},78,92,88,78}, {3,"岳灵珊","女",{1999,08,26},89,72,98,66}, {4,"任盈盈","女",{1999,08,26},78,95,87,90}
结构体数组
学号 姓名 性别
入学时间
年
月
日
计算机 原理
英语
数学
音乐
struct STUDENT
{
int
studentID;
char char
studentName[10]; studentSex[4];
struct date timeOfEnter;
int
scoreComputer;
int
scoreEnglish;
struct student student1,student2;/*It works*/
student student1,student2;/*Can this work?*/
typedef struct student STUD ;
STUD student1,student2;
/*It works!*/
{
int
studentID;
char
studentName[10];
char
studentSex[4];
struct date timeOfEnter;
int
scoreComputer;
int
scoreEnglish;
int
scoreMath;
int
scoreMusic;
};
pStu
struct STUDENT stu; /*定义结构体变量*/
直接定义结构体变量(不出现结构体名)
定义自己的类型名
struct student {
int num; char name[20]; char sex; int age; float score; char addr[30]; };
typedef为一种已存在 的类型定义一个新名字
STUD与struct student类型是同义词
结构体: – 把关系紧密、且逻辑相关的多种不同类型的变
量,组织到统一的名字之下
– 占用相邻的一段内存单元
共用体: – 把情形互斥、但逻辑相关的多种不同类型的变
量,组织到统一的名字之下
– 占用同一段内存单元,每一时刻只有一个数据
起作用
结构体类型的定义
num name sex age score addr 10010 LiFun M 18 87.5 Beijing
};
结构体变量的指针
struct STUDENT
{
int
studentID;
char
studentName[10];
char
studentSex[4];
struct date timeOfEnter;
int
scoreComputer;
int
scoreEnglish;
int
scoreMath;
int
数组的解决方法
数据的内存管理方式
1
2 3 4 ……
令狐冲 林平之 岳灵珊 任盈盈
……
男 男 女 女
……
1999 1999 1999 1999 ……
90 78 89 78 ……
83 92 72 95 ……
72 88 98 87 ……
82 78 66 90 ……
数组的解决方法
数据的内存管理方式
1
2 3 4 ……
8
结构体的内存占用
i ch
f
i
ch
f
事实上所有数据类型在内存中都是从偶数地址开始存放的 且结构所占的实际空间一般是按照机器字长对齐的 不同的编译器、平台,对齐方式会有变化 结构体变量的成员的存储对齐规则是与机器相关的 具有特定数据类型的数据项的大小也是与机器相关的 所以一个结构体在内存中的存储格式也是与机器相关的
男 1999
90 83 72 82
2 林平之
男 1999
78 92 88 78
3 岳灵珊
女 1999
89 72 98 66
4 任盈盈
女 1999
78 95 87 90
结构体的解决方法
struct STUDENT
{ int studentID;
/*每个学生的序号*/
char studentName[10];/*每个学生的姓名*/
};
建立了数据库中的多条记录,每条对应一个学生信息
1 令狐冲 男
90
80
1999 8 26
72
82
2 林平之 男
78
1999 8 26
92
88
78
3 岳灵珊 女
89
1999 8 26
72
98
66
4 任盈盈 女
78
95
1999 8 26
87
90
初始化
struct STUDENT stu[30] = {{1,"令狐冲","男",{1999,08,26},90,83,72,82}, {2,"林平之","男",{1999,08,26},78,92,88,78}, {3,"岳灵珊","女",{1999,08,26},89,72,98,66}, {4,"任盈盈","女",{1999,08,26},78,95,87,90}
第8章 结构体与共用体
本章内容
结构体(结构structure)类型 共用体(联合union)类型 结构体变量、结构体数组、结构体指针 向函数传递结构体 用结构体指针实现动态数据结构 链表的概念及操作原理
思考一个问题
在程序里表示一个人(姓名、年龄、性别…), 怎么表示? 想表示多个人呢? 如何用计算机程序实现下述表格的管理?
结构体的内存占用
double 占用内存字节数 = 8 struct 类型用内存字节数 = ? 是所有成员变量的内存总和吗?
用运算符sizeof获得结构体大小 sizeof(变量或表达式) sizeof(类型)
struct number
{ short i; char ch;
float f;
};
printf("%d\n", sizeof(struct number));
struct student {
int num; char name[20]; char sex; int age; float score; char addr[30]; } student1,student2;
struct {
int num; char name[20]; char sex; int age; float score; char addr[30]; } student1,student2;
struct student {
int num; char name[20]; char sex; int age; float score; char addr[30]; };
结构体变量的定义
先定义结构体类型再定义变量名
struct student student1,student2;
在定义类型的同时定义变量
int
scoreMath;
int
scoreMusic;
};
struct STUDENT stu[30];
struct
{ int int int
};
date
year; month; day;
结Hale Waihona Puke 体定义 可以嵌套结构体数组
struct STUDENT
{
int
studentID;
char
studentName[10];
表8-1 某学校学生成绩管理表
学号 姓名 性别 入学时间 计算机原理 英 语
1 令狐冲 男 1999
90
83
2 林平之 男 1999
78
92
3 岳灵珊 女 1999
89
72
4 任盈盈 女 1999
78
95
数学 72 88 98 87
音乐 82 78 66 90
5 ……
6 ……
数组的解决方法
int studentId[30]; /* 最多可以管理30个学生, 每个学生的学号用数组的下标表示*/
struct类型的特点
是一个普通的类型 – 可以定义该类型的变量、数组、指针…… – 可以做函数的参数类型和返回值类型 – 它的成员可以是任意类型
基本类型、数组、指针、结构体、共用体……
struct类型的变量 – 两个结构体变量之间可以相互赋值
所以做为函数的参数时,是传值调用
– 可以取地址& – 不可直接参与算术和比较运算 面向对象和数据库是struct思想的发展
struct STUDENT *pStu; /*定义结构体指针*/
pStu = &stu;
通过stu和成员运算符访问结构体成员
– stu. studentID = 1;
通过pStu和指向运算符访问结构体成员
– (*pStu). studentID = 1;
– pStu -> studentID = 1;
令狐冲 林平之 岳灵珊 任盈盈
……
男 男 女 女
……
1999 1999 1999 1999 ……
90
83
72
82
78 分配内存不92集中,寻址效8率8 不高
78
89 对数组进行赋72初值时,容易9发8 生错位 66
78 结构显得比95较零散,不容87易管理
90
……
……
……
……
希望的内存分配图
1 令狐冲
结构体类型的定义
num name sex age score addr 10010 LiFun M 18 87.5 Beijing
struct 结构体名 {
类型关键字 成员名1; 类型关键字 成员名2; …... 类型关键字 成员名n; };
只定义了数据的形式,即声 明了一种复杂的数据类型, 并未生成任何变量。
数组的解决方法
int studentId[30] = {1,2,3,4,5,6}; char studentName[30][10]={{"令狐冲"},{"林平之"},
{"岳灵珊"},{"任盈盈"}}; char studentSex[30][2]={{"男"},{"男"},{"女"},{"女"}}; int timeOfEnter[30] = {1999,1999,1999,1999}; int scoreComputer[30] = {90,78,89,78}; int scoreEnglish[30] = {83,92,72,95}; int scoreMath[30] = {72,88,98,87}; int scoreMusic[30] = {82,78,66,90};
int scoreMusic;
/*每个学生的音乐成绩*/
};
struct STUDENT是一个类型
struct STUDENT students[4];
students[0].studentID students[0].scoreComputer
– 它们都是变量,一般称为结构的成员变量
用户自定义的数据类型
scoreMusic;
};
pStu
struct STUDENT stu; /*定义结构体变量*/
struct STUDENT *pStu; /*定义结构体指针*/
pStu = &stu;
stu 成员1 成员2 成员3 成员4 成员5 成员6 成员7 成员8
如何访问结构体的成员
struct STUDENT
char studentName[30][10]; char studentSex[30][2]; int timeOfEnter[30]; /*入学时间用int表示*/ int scoreComputer[30];/*计算机原理课的成绩*/ int scoreEnglish[30]; /*英语课的成绩*/ int scoreMath[30]; /*数学课的成绩*/ int scoreMusic[30]; /*音乐课的成绩*/