概述
一文攻破结构体-C语言
1 什么是结构体
1.1 结构体类型
结构体(structure
)是由不同类型数据组成的组合型的数据结构,可以看做变量的集合。结构体也是一个数据类型,就像和 int
、char
一样的数据类型,只不过 int
等数据类型是系统已经声明好的,而结构体数据类型是由用户根据需要在程序中指定的,并且可以声明很多种。
1.2 结构体类型的声明
声明一个结构体类型的一般形式:
struct 结构体名
{
成员表列
};
花括号内是该结构体所包括的子项,称为结构体的成员(member
),成员可以是一种结构体类型(当前结构体类型或其他结构体类型)的变量。
注意:结构体类型的名字是由一个关键字 struct
和结构体名组合而成的(例如 struct Info
)。结构体名是由用户指定的,又称为“结构体标记”(structure tag
),以区别于其他结构体类型,即可以设计出许多种结构体类型,而并非只有一种。
struct Info
{
int id;
char name[10];
int age;
char sex;
};
1.3 定义结构体类型变量
(1)先声明结构体类型,再定义该类型的变量
struct Info info1, info2;
struct Info
:结构体类型名info1, info2
:结构体变量名
(2)在声明类型的同时定义变量,但是这样定义的变量是全局变量
struct Info
{
int id;
char name[10];
int age;
char sex;
} info;
(3)不指定类型名而直接定义结构体类型变量
struct
{
成员表列
} 变量名表列;
对于这种方式,将不能再以此结构体类型去定义其他变量。
(4)使用关键字 typedef
定义结构体变量
typedef
:指定新的类型名来代替已有的类型名- 使用格式:
typedef {已有的类型名} {新的类型名}
typedef struct Info
{
int id;
char name[10];
int age;
char sex;
} info;
-
根据
typedef
的用法,可以得出以下代码段相当于{已有的类型名}
struct Info { int id; char name[10]; int age; char sex; }
-
info
相当于{新的类型名}
接下来,我们便可以使用结构类型 info
来定义结构体变量,如 info info1
1.4 结构体数据类型变量所占内存
在定义好了结构体变量后,系统会为之分配内存单元。不同的编译系统对结构体变量在内存中分配空间有不同的规定。
在 Visual C++
中结构体变量所占内存大小就是其各个成员所占内存大小的和,如下这个结构体变量:
struct Info
{
int id;
char name[10];
int age;
char sex;
} info;
其成员变量所占的内存大小为 4 + 10 + 4 + 1 = 19
,即理论上该结构体变量所占内存大小为 19
,实际上其所占内存大小为 20
。即当运行 sizeof(info)
时,其输出结果为 20
。
由于计算机对内存的管理是以“字”为单位的(许多计算机系统以 4 个字节为一个“字”)。如果在一个“字”中只存放了一个字符,虽然只占一个字节,但该“字”中的其他 3 个字节不会接着存放下一个数据,而是从下一个“字”开始存放其他数据,所以用 sizeof
运算符测量变量的长度时,其输出的所占内存大小是 4 的倍数。
2 操作结构体
2.1 结构体变量的初始化
(1)在定义结构体变量时对它的成员初始化
struct Info
{
int id;
char name[10];
int age;
char sex;
} info = {201807103142, "tianyvHon", 23, 'M'};
(2)通过引用的方式进行初始化
struct Info info = {
.id = 201807103142;
.name = "tianyvHon";
.age = 23;
.sex = 'M'
};
.name
隐含代表结构体变量 info
中的成员 info.name
,如果有未被指定初始化的变量,那么数值型成员被系统初始化为 0
,字符型成员被系统初始化为