写在前面
之前学过整型、实型和字符串的基本类型,但这些数据类型只能定义单一的数据属性,因此我们引入构造类型,来定义复杂数据类型,反映事物的多种属性。
我们把结构体和联合体放在一起来讲,为什么呢,因为他们两个之间关系很大。
我们先讲结构体。
结构体
事物往往有多个属性,就像一个学生有名字还有学号性别年龄班别等等,结构体是一种自定义类型,可以把多个属性组合成一个整体,加强数据类型之间的联系。
看一个例子:
struct student
{
char name[11],number[11],sex;
int score,class;
};
在这里,我们定义了一个student结构体,struct是关键字,student是结构体名字,这个是由自己定义的名字,然后里面定义了一些属性,这样我们就完成的一个结构体的定义。
要注意的是,我们只是在申明一个复杂数据类型student而已,并没有定义变量,因此,系统不会为其分配内存,它就像int和long一样只是一个数据类型。
怎么来定义变量呢?
有两种方法:
一是在定义结构体时就定义变量:
struct student
{
char name[11],number[11],sex;
int score,class;
}xiaoming;
而是之后定义:
struct student xiaoming;
C++中可以不用加上struct,直接:
student xiaoming;
在C语言中,想要直接像C++那样也可以,不过定义的时候要写成这样:
typedef struct
{
char name[11],number[11],sex;
int score,class;
}student;
结构体数据成员的引用方式有三种:
常见的是这个:
xiaoming.name
即变量名加下标点加数据成员名。
还有一种常见的,在链表的时候露脸:
p->name
不过在这之前要有这句话:
student *p=&xiaoming;
即通过指针来引用。
当然指针还可以这样玩:
(*p).name
结构体入门就讲这么多,下面我们来讲联合体。
再讲联合体之前,非常有必要讲一下结构体变量的内存分配,理论上,结构体变量所占内存空间的大小等于它所包含的每个成员所占内存空间大小之和,但实际上,可能由于编译环境的不同,实际情况也会有所区别,还有可能是它的内存是数据成员中内存最大的那个的整数倍。
联合体
一种构造类型,可以把几种不同类型的数据存放在同一段内存中(注意这句话)。
定义格式和结构体一样,除了关键字不一样:
union just_a_name
{
short a;
char b;
float f;
};
联合体的各成员相互覆盖,不能同时引用,因为它们共用一处内存,这是联合体和结构体不一样的地方,此外,联合体的引用和结构体完全一样。
只要理解到,联合体的各个数据成员共用一处内存,很多问题就可以理解了。