C 语言重拾【八】结构和其他数据形式

在 C 语言中,结构体是一种非常重要的数据类型。它可以将不同的数据类型组合成一个整体,方便程序员进行操作。比如,我们可以定义一个结构体来表示一个人的信息,包括姓名、年龄、性别等等。使用结构体可以使得程序更加清晰易懂,提高代码的可读性和可维护性。

结构声明(structure declaration)描述了一个结构的组织布局。声明类似下面这样:

1
2
3
4
5
struct book {
char title[MAXTITL];
char author[MAXAUTL];
float value;
};

该声明描述了一个由两个字符数组和一个 float 类型变量组成的结构。该声明并未创建实际的数据对象,只描述了该对象由什么组成。我们来分析一些细节。首先是关键字 struct,它表明跟在其后的是一个结构,后面是一个可选的标记(该例中是 book),稍后程序中可以使用该标记引用该结构。所以,我们在后面的程序中可以这样声明:

1
struct book library;

这把 library 声明为一个使用 book 结构布局的结构变量。

结构有两层含义。一层含义是“结构布局”,刚才已经讨论过了。结构布局告诉编译器如何表示数据,但是它并未让编译器为数据分配空间。下一步是创建一个结构变量,即是结构的另一层含义。程序中创建结构变量的一行是:

1
struct book library;

编译器执行这行代码便创建了一个结构变量 library。编译器使用book模板为该变量分配空间:一个内含 MAXTITL 个元素的 char 数组、一个内含 MAXAUTL 个元素的 char 数组和一个 float 类型的变量。这些存储空间都与一个名称 library 结合在一起。

一个结构的内存分配

1
struct book library;

是以下声明的简化:

1
2
3
4
5
struct book {
char title[MAXTITL];
char author[AXAUTL];
float value;
} library;  /* 声明的右右花括号后跟变量名*/

换言之,声明结构的过程和定义结构变量的过程可以组合成一个步骤。如下所示,组合后的结构声明和结构变量定义不需要使用结构标记:

1
2
3
4
5
struct { /* 无结构标记 */
char title[MAXTITL];
char author[MAXAUTL];
float value;
} library;

然而,如果打算多次使用结构模板,就要使用带标记的形式;或者,使用本章后面介绍的 typedef