C语言基础(结构体与共用体)
一、结构体
1、结构体的定义
结构体是一种复合的数据类型,里面可以包含多个单一的数据类型
在结构体变量定义之前往往需要先设计结构体,定义结构体的名称和成员的数据类型,然后使用结构体说明变量,这时候结构体就成了一种新的数据结构。定义结构体往往用struct来修饰:
struct 结构体名
{
成员项列表
};
结构体名是该结构体独一无二的名称,命名规则与变量命名相同。成员项列表是结构体中数据成员的数据类型和名称,数据成员可以是变量、数组、或者其他结构体等符合数据结构。成员列表的一般形式为:
数据类型 成员名1;
数据类型 成员名2;
数据类型 成员名3;
数据类型 成员名4;
数据类型 成员名5;
...
比如;
struct student //结构体名
{
char name[50]; //姓名
char dept[50]; //专业
long no; //学号
float score[4]; //成绩
}; //结构体定义结束一定要加上分号
结构体定义后,并没有在内存中为该结构体划分存储空间,他只是作为一种数据结构存在。只有在使用结构体类型变量类型声明变量后,系统才用该结构体分配内存空间给变量。使用结构体声明变量的一般形式是;
struct student stu1,stu2; //声明结构体变量stu1,stu2
结构体变量的声明还有其他形式,例如直接在定义结构体的同时声明变量,或者省略结构体名直接定义结构体类型的变量。如:
struct student {
...
}stu1,stu2; //定义结构体同时声明变量
struct{
...
}strc1,strc2; //省略结构体名直接定义结构体类型的变量
这两种用法使结构体丧失了通用性,特别是省略结构体名的做法,这样结构体就不能在源代码其他部分声明更多的结构体变量。在编写大型程序的源码时,结构体定义部分通常放在头文件中,使用时包含该头文件即可,这样一个结构体不需要程序的不同文件中反复定义。
结构体的内存分配:

开辟了连续的内存空间,但是注意不同类型的数据会 中间多占用内存(对齐)。
2、结构体变量的引用
应用结构体变量的数据需要同时给出结构体变量名和数据成员名,引用结构体变量的一般形式是:
结构体变量名.数据变量名
比如上述例子中引用数据成员:
stu1.no = 20090001; //使用"."操作符引用结构体成员
这两种符号的优先级高于算术运算符,所以结构体变量的成员与普通的变量或数组使用方法完全相同。
3、结构体类型变量的初始化
结构体汇集了不同的数据类型,为结构体类型变量初始化就略显复杂,需要考虑初始化数据与结构体成员项数据类型的匹配。如下例所示:
struct student stu1 = {"Tom","Math",20090001,87.5,70.5,93,91};
//声明结构体变量并初始化
该语句为结构体变量stu1的成员赋值,各成员的值分别为:
stu1.name = "Tom"
stu1.dept = "Math"
stu1.no = 20090001
stu1.score[0] = 87.5
stu1.score[1] = 70.5
stu1.score[2] = 93
stu1.score[3] = 91
这种初始化方法的原理是,结构体的成员在内存的连续空间中顺序存储,从结构体的首地址开始依次将相匹配的数据类型保存在对应的内存单元中。如果结构体中以另一个结构体作为成员,比如:
struct strc1 //定义结构体strc1
{
int a; //定义整型数据成员
long b; //定义长整型数据成员
}
struct strc2 //定义结构体strc2
{
float a; //定义单精度浮点型数据成员
struct strc1 b; //将结构体strc1作为strc2的成员项
}
struct strc2 x; //定义结构体变量x
那么结构体变量x中各成员的分配仍然是在连续空间中,结构体变量x的成员项b在内存空间中的总长度为结构体strc1定义的长度,分布形式如strc1定义的顺序,如图:(后续可能要改)
二、结构体数组
4、结构体数组的定义和使用
当需要使用大量相同的结构体变量时候,可使用结构体定义数组,该数组包含与结构体相同的数据结构所组成的连续存储空间。如下例所示:
struct student stu_a[50]; //声明长度为50的结构体数组stu_a
引用结构体数组中的元素的一般形式为:
结构体数组名[n].成员名
[]符号的优先级与.符号相同,适用于自左向右结合性,所以运算时候首先获得的是结构体数组的元素,然后再获得该元素的成员。如果该成员是数组,引用该成员数组元素的一般形式为:
结构体数组名[n].成员名[n]
同理,如果该成员是结构体变量,引用形式为:
结构体数组名[n].成员名[n].子成员