第7讲 结构体与共用体 7.1 结构体 7.2 共用体
学习目标 理解结构体的概念。 掌握结构体、共用体类型的定义。 掌握结构体变量 、结构体数组和结构体指针 的使用。 理解共用体变量、共用体指针的使用。 理解链表的创建和输出。
第7讲 结构体与共用体 7.1.1 结构体的定义和初始化 7.1.2 结构体的使用 7.1.3 结构体数组 7.1.4 结构体与指针
字符串 字符+数字 数字 多种不同类型数据的混合结构 结构体数据 乘客信息系统,混合结构大数据管理
结构体的概念 结构体 将不同类型的数据有序组合在一起 是用户的自定义数据类型 需要先定义再使用
结构体的定义 结构体的定义格式: struct 结构体名 { 类型标识符1 成员名1; … 类型标识符n 成员名n; }; 自定义的结构体类型名 结构体的定义格式: struct 结构体名 { 类型标识符1 成员名1; … 类型标识符n 成员名n; }; struct是结构体类型的标识 结构体类型中成员的名字 分号不能缺!
登机乘客信息管理 登机乘客信息 编号 姓名 年龄 性别 体重 行李重量 所选套餐 No Name Age Sex Weight Luggage Meal 1 David 21 M 89.9 495.2 A 2 Kate 14 F 54.2 376.3 B 3 John 70 74.2 469.6 4 Mary 46 62.7 412.7
例1:定义结构体 struct passenger { int no; char name[20]; int age; char sex; float weight; float luggage; char meal; }; 编号 姓名 年龄 性别 体重 行李重量 所选套餐
结构体变量 结构体变量 为自定义结构体数据类型的变量 定义结构体类型变量时开辟内存空间 在内存所占的存储空间等于各成员存储空间的总和 1.先定义结构体类型再定义变量名 结构体变量定义方式 2.在定义结构体类型的同时定义变量名 3.不定义结构体类型名,只定义结构体变量名
结构体变量的定义 1. 先定义结构体类型再定义变量名 例1 struct student { int num; char name[20]; char sex; int age; float score; char addr[30]; }; 先定义结构体数类型 struct 结构体名 { 成员列表; } 结构体名 变量名列表 struct student student1, student2; 结构体类型名 变量1 变量2
结构体变量的定义方法 1. 先定义结构体类型再定义变量名 例2 struct date { int day; int month; int year; }; struct student char name[20]; struct date birthday; } struct student stu; 例2 一个结构体中可包含其他结构体的变量!
结构体变量的定义方法 1. 先定义结构体类型再定义变量名 例3 # define STUDENT struct student { int num; char name[20]; char sex; char addr[30]; }; STUDENT student1, student2; 利用宏简化程序! 凡是STUDENT的地方都用struct student机械替换
结构体变量的定义方法 2.在定义结构体类型的同时定义变量名 例1 struct 结构体名 { 成员列表 } 变量名列表; struct student { int num; char name[20]; char sex; int age; float score; char addr[30]; } student1, student2; struct 结构体名 { 成员列表 } 变量名列表; 在定义结构体类型的同时定义变量
结构体变量的定义方法 3.不定义结构体类型名,只定义结构体变量名 例1 struct { 成员列表 } 变量名列表; struct { int num; char name[20]; char sex; int age; float score; char addr[30]; } student1, student2; 不出现结构体名 struct { 成员列表 } 变量名列表;
结构体变量定义 结构体变量的定义例 定义结构体类型变量时开辟内存空间 void main(void) { struct date { int year, month, day; } today; cout<<sizeof(struct date)<<endl; } 定义结构体类型变量时开辟内存空间 12
例:结构体变量的定义 变量类型 变量名 struct passenger person1, person2, person3, person4; struct passenger person[4]; 用数组替代具体变量
结构体变量的初始化 直接在结构体变量之后通过赋值语句完成初始化 对变量初始化,一一赋值 void main(void) { struct student { long int num; char name[20]; char sex; char addr[30]; } student1={901031, “Li Lin”, ‘M’, “123 Beijing Road”}; cout<<student1.name<<endl; 对变量初始化,一一赋值 输出: Li Lin
例3:结构体变量的初始化 struct passenger person[4]= { {1, “David”, 21, ‘M’, 89.9, 495.2, ‘A’}, {2, “Kate”, 14, ‘F’, 54.2, 376.3, ‘B’}, {3, “John”, 70, ‘M’, 74.2, 469.6, ‘B’}, {4, “Mary”, 46, ‘F’, 62.7, 412.7, ‘A’}; };
结构体变量的使用 结构体变量名 成员名 . 结构体变量的使用格式 成员运算符 cin>>student1; 结构体变量不能作为一个整体进行输入或输 出,只能分别使用变量的各个成员。 错误 cin>>student1; 必须用成员名引用 cin>>student1.num; student1.num=100;
结构体变量的使用 使用结构体变量成员格式 student1.birthday.day=25; 嵌套的结构体变量必须逐层引用。 student1.birthday.day=25; 如果结构体变量的成员本身又是一个结构体类型,则要用若干个成员运算符,由外向内逐层找到最内层的一级成员,而且只能对最内层的成员进行访问。
结构体变量的使用 如何统计选择B套餐的乘客数目,并输出他们的名字? for(i=0, select_B=0; i<4; i++) { if(person[i].meal==‘B’) select_B++; cout<<person[i].name<<endl; } cout<<“The total is”<<select_B<<endl; 结构体变量引用成员作为判断条件 统计B套餐的数目 输出选择B套餐的乘客姓名 Kate John The total is 2
结构体变量的使用 使用结构体变量成员格式 student1.birthday.day++; student1.score+=60; 结构体变量中的成员可以同一般变量一样进行运算。 student1.birthday.day++; student1.score+=60; 结构体变量的成员同普通变量一样,都可以进行同类型普通变量所允许的各种运算。
结构体数组 结构体数组定义 结构体数组:结构体数组中的每个元素都是 一个结构体类型的变量,其中包括该类型的 各个成员。数组各元素在内存中连续存放。 struct student { 成员列表; }; student std[5];
结构体数组 struct student { int num; char name[20]; char sex; int age; float score; char addr[30]; } ; struct student stu[30]; struct student { int num; char name[20]; char sex; int age; float score; char addr[30]; } stu[30]; 直接定义
结构体数组 结构体数组初始化 与数值型数组的初始化方式类似,只需将数组 的各个元素用花括号分隔开。 struct student 与数值型数组的初始化方式类似,只需将数组 的各个元素用花括号分隔开。 struct student { int num; char name[20]; char sex; } stu[3]={ {1011, "Li Lin",'M'}, {1012,"Wang Lan",'F'}, {1013,"Liu Fang",'F'}};
结构体数组 结构体数组名[下标].成员名 结构体数组的使用 结构体数组的引用与普通数组类似,同样通过下标 来访问。数组元素是结构体类型,所以只能对成 员进行访问。 结构体数组名[下标].成员名
例: struct person { char name[9]; int age; }; struct person bme[10]={ “Jone”,17, “Paul”,19, “Mary”,18, “Adam”,16 cout<<bme[3].name<<endl; cout<<bme[3].name[1]<<endl; cout<<bme[2].name[1]<<endl; cout<<bme[2].name[0]<<endl; 输出:Adam 输出:d 输出:a 输出:M
第7讲 结构体与共用体 7.1.1 结构体的定义和初始化 7.1.2 结构体的使用 7.1.3 结构体数组 7.1.4 结构体与指针 第7讲 结构体与共用体 7.1.1 结构体的定义和初始化 7.1.2 结构体的使用 7.1.3 结构体数组 7.1.4 结构体与指针 7.1.5 结构体的应用—链表
结构体与指针 例如:student stu; student *p=&stu; 结构体指针变量定义 结构体指针变量的定义和初始化格式与普通指 针变量类似。 例如:student stu; student *p=&stu;
结构体与指针 结构体指针变量的使用 格式: 结构体指针变量名->结构体成员名 (*结构体指针变量名).结构体成员名 例如:student stu; student *p=&stu; cout <<p->num <<(*p).num; 必须加圆括号,因为“.”运算符优先级更高。
例: #include <iostream> using namespace std; struct student //定义结构体 { long num; char name[20]; int age; }; void main() { student a={20418132,"ZhaoGang",23}; student *p; //定义结构体指针变量 p=&a; //给结构体指针变量赋值 cout<<a.num<<" "<<a.name <<" "; cout<<a.age<<endl; cout<<(*p).num<<" <<(*p).name<<" "; cout<<(*p).age<<endl; cout<<p->num<<" "<<p->name<<" "; cout<<p->age<<" "<<endl; }
第7讲 结构体与共用体 7.1 结构体 7.2 共用体
7.2 共用体 引入 定义一个student结构体,里面包含姓名、年龄、性别、班级等信息。 定义一个teacher结构体,里面包含姓名、年龄、性别、职称等信息。 定义一个结构体,它即表示student结构体,也表示teacher结构体。 在student结构体里面代表班级信息,在teacher结构体里面代表职称信息。 “共用”是指多种不同类型的变量从同一地址开始存放,共同占用同一段内存单元。
7.2 共用体 6.2.1 结构体与共用体变量的定义 6.2.2 共用体变量的使用 6.2.3 共用体与指针
7.2.1 共用体与共用体变量定义 共用体类型定义格式 union 共用体类型名 { 类型标识符1 成员名1; … 类型标识符n 成员名n; 7.2.1 共用体与共用体变量定义 共用体类型定义格式 union 共用体类型名 { 类型标识符1 成员名1; … 类型标识符n 成员名n; }; 共用体类型定义的标识符
7.2.1 共用体与共用体变量定义 共用体类型定义格式 union data { char a; int b; float c; };
7.2.1 共用体与共用体变量定义 所谓“共用”是指多种不同数据类型的变量从 同一地址开始存放,共同占用同一段内存单元 。 7.2.1 共用体与共用体变量定义 所谓“共用”是指多种不同数据类型的变量从 同一地址开始存放,共同占用同一段内存单元 。 但是在某一时刻有且仅有一个变量占用这一段 内存单元。 这种由不同类型的数据共用同一段内存单元的 用户自定义类型成为共用体。
7.2.1 共用体与共用体变量定义 可以把一个char型变量a,一个short型变量b和 一个long型变量c存放在起始地址为2000的同 一段内存单元中。 2000 a b c
7.2 共用体 7.2.1 结构体与共用体变量的定义 7.2.2 共用体变量的使用 7.2.3 共用体与指针
共用体变量的使用 共用体变量的使用 u1.a //只能直接使用变量中的成员 u1.b u1.c 不能对共用体变量初始化和赋值 union data { char a; int b; float c; }u1={‘A’, 25, 3.5}; //错误的! u1.a //只能直接使用变量中的成员 u1.b u1.c
共用体变量的使用 共用体变量的使用 共用体变量虽然可以存放几种不同类型的成员,但在同一时刻只能有一个成员起作用,其它成员不起作用。 不能对共用体变量初始化和赋值 共用体变量虽然可以存放几种不同类型的成员,但在同一时刻只能有一个成员起作用,其它成员不起作用。 共用体变量中起作用的成员是最后一次存放的成员。
共用体变量的使用 18 union un { int i; double y; }; struct st { char a[10]; union un b; cout<<sizeof(struct st)<<endl; 18
输出:4 8 x a b 4 2 1 in y 8 b void main(void) { union EXAMPLE { struct { int x, int y;} in; int a,b; }e; e.a=1; e.b=2; e.in.x=e.a*e.a; e.in.y=e.b+e.b; cout<<e.in.x<<‘\t’<<e.in.y<<endl; } x a b 4 2 1 in y 8 b 输出:4 8
共用体 7.2.1 结构体与共用体变量的定义 7.2.2 共用体变量的使用 7.2.3 共用体与指针
7.2 共用体 共用体与指针 共用体指针变量的定义与对共用体的引用形式与结 构体类似。 #include <iostream> 共用体指针变量的定义与对共用体的引用形式与结 构体类似。 #include <iostream> using namespace std; union data { char a; short b; long c; }; void main() { union data un,*p; p=&un; un.a='s'; cout<<p->a<<endl; un.b=6; cout<<p->b<<endl; un.c=18; cout<<p->c<<endl; }
7.2 共用体 7.2.1 结构体与共用体变量的定义 7.2.2 共用体变量的使用 7.2.3 共用体与指针
思考题: 额定重量是指安全飞行允许的每位乘客重量(乘客体重与 行李重量之和)的上限 额定重量是指安全飞行允许的每位乘客重量(乘客体重与 行李重量之和)的上限 2003年1月8日,由于多位乘客超过额定重量且满员飞行, 美联航一架客机在佛罗里达州失事。 设额定重量为530kg,编程检查班机上是否有超标乘客。若 有,输出乘客的信息。 网络课程平台http://course.cn/G2S/Template/View.aspx?action=view&courseType=0&courseId=2272