结构与联合
【1】结构体需要注意那些知识点?
(1)数组是为了更清晰的记录有限个相同类型的数据信息而诞生的一种表示形式。
结构体是为了更清晰的记录一个具有不同类型属性特性的对象而诞生的一种表示形式。
联合与结构都是由多个不同的数据类型成员组成,但在任何同一时刻,联合中只存放了一个被选中的成员,而结构的所有成员都存在。
也就是说结构体是对数组在“横向”的扩充。 而联合是对结构体在“纵向”的收敛。
任何事物的出现都是有一定原因的,而且是可以由逻辑推理而成立的。
(2)在C++中结构体是与类没有太大的区别。有且仅有的区别就是:struct 默认成员是公有public ,而 class 默认成员是私有private。
(3)结构体的定义。示例代码如下:
1 //第一种 定义结构体类型变量名方式:
2 struct student //struct为关键字,不能省略。student为定义的类型为结构体的变量名,一般要求"见名知意"
3 {
4 int num; //学号用整型的变量名num定义
5 char name[30]; //姓名用字符数组型的变量名name定义,长度为30
6 char sex; //性别用字符型的变量名 sex定义
7 int age; //年龄用整型的变量名age定义
8 float score; //成绩用实型的变量名score定义
9 char addr[30]; //地址用字符数组型的变量名addr定义
10 };
11 struct student stu1,stu2; //定义结构体类型变量
12
13
14 //第二种 定义结构体类型变量名方式:
15 struct student //struct为关键字,不能省略。student为定义的类型为结构体的变量名,一般要求"见名知意"
16 {
17 int num; //学号用整型的变量名num定义
18 char name[30]; //姓名用字符数组型的变量名name定义,长度为30
19 char sex; //性别用字符型的变量名 sex定义
20 int age; //年龄用整型的变量名age定义
21 float score; //成绩用实型的变量名score定义
22 char addr[30]; //地址用字符数组型的变量名addr定义
23 } student1,student2;
24 //直接定义结构体类型变量,变量名为student1,student2
25
26
27 //第三种 结构体中的成员也可以是某种结构体
28 struct date //日期结构
29 {
30 int month; //整型类型 月 month
31 int day; //整形类型 日 day
32 int year; //整形类型 年 year
33 };
34
35 struct student //struct为关键字,不能省略。student为定义的类型为结构体的变量名,一般要求"见名知意"
36 {
37 int num; //学号用整型的变量名num定义
38 char name[30]; //姓名用字符数组型的变量名name定义,长度为30
39 char sex; //性别用字符型的变量名 sex定义
40 int age; //年龄用整型的变量名age定义
41 float score; //成绩用实型的变量名score定义
42 char addr[30]; //地址用字符数组型的变量名addr定义
43 struct date birthday; //生日用结构体类型变量名birthday定义
44 };
(4)结构体的赋值。示例代码如下:
1 struct student //struct为关键字,不能省略。student为定义的类型为结构体的变量名,一般要求"见名知意"
2 {
3 int num; //学号用整型的变量名num定义
4 char name[30]; //姓名用字符数组型的变量名name定义,长度为30
5 char sex; //性别用字符型的变量名 sex定义
6 int age; //年龄用整型的变量名age定义
7 float score; //成绩用实型的变量名score定义
8 char addr[30]; //地址用字符数组型的变量名addr定义
9 };
10 struct student stu1={1001,"liu yong",'M',22,95.5,"shan xi sheng"}
【2】联合需要注意哪些知识点?
(1)理论知识
联合(union)与结构的区别是:结构变量的各成员同时被分配了各自独立的内存区,而联合变量的各个成员的存储开始地址都相同,
所以在任一时刻联合变量只能存储一个成员。系统为联合变量分配空间时按需要最大存储量的成员大小分配内存空间。
联合被称为一种特殊的类(它因编译器不能知道成员的类型,而没有构造函数和析构函数,所以联合的对象不是由构造函数生成的。故称特殊的类)。
(2)示例代码
1 #include<iostream>
2 using namespace std;
3 union Node
4 {
5 short a;
6 char ch[2];
7 };
8 void main()
9 {
10 Node n;
11 n.ch[1]=1;
12 n.ch[0]=2;
13
14 cout<<n.a<<endl; //258
15 }
解析:
结构变量的各成员同时被分配了各自独立的内存区,
而联合变量的各个成员的存储开始地址都相同,
所以在任一时刻联合变量只能存储一个成员。
联合体是一种节省空间的类
一种节省内存的机制
short a 占两个字节
char ch[2] 占两个字节
那么,在这里即就是:只为一个结构对象分配两个字节
当对数组赋值的时候,可以对同一个内存
通过另外的成员进行访问
0000 0001 0000 0010 == 2 + 256 = 258