Data frequently exists in groups. For example, an employer must keep track of the name, age, and salary of each employee. Accessing these values is simplified if they can be stored together. However, if the values are different types, as they are in this example, they cannot be stored together in an array. In C, values with dissimilar types can be stored together using a structure.
数据经常以成组的形式存在。例如,雇主必须明了每位雇员的姓名、年龄和工资。如果这些值能够存储在一起,访问起来会简单一些。但是,如果这些值的类型不同(就像现在这种情况),它们无法存储于同一个数组中。在C 中,使用结构可以把不同类型的值存储在一起。
10.1 Structure Basics
An aggregate data type is one that can hold more than one individual piece of data at a time. C provides two types of aggregate data, arrays and structures. Arrays are collections of elements of the same type, and individual elements are selected through a subscript or indirection on a pointer.
聚合数据类型(aggregate data type) 能够同时存储超过一个的单独数据。C 提供了两种类型的聚合数据类型,数组和结构。数组是相同类型的元素的集合,它的每个元素是通过下标引用或指针间接访问来选择的。
A structure is also a collection of values, called members, but the members of a structure may be of different types. A structure is quite similar to a record in Pascal or Modula.
结构也是一些值的集合,这些值称为它的成员(member) ,但一个结构的各个成员可能具有不同的类型。结构和Pascal 或Modula 中的记录(record)非常相似。
Array elements can be accessed via a subscript only because all of the elements are the same size. The situation is different with structures. Because a structureʹs members can be of different sizes, subscripts cannot be used to access them. Instead,structure members are given names and are accessed by those names.
数组元素可以通过下标访问,这只是因为数组的元素长度相同。但是,在结构中情况并非如此。由于一个结构的成员可能长度不同,所以不能使用下标来访问它们。相反,每个结构成员都有自己的名字,它们是通过名字访问的。
This distinction is important. A structure is not an array of its members. Unlike an array name, the name of a structure variable is not replaced with a pointer when it is used in an expression. Subscripts cannot be used on a structure variable to select specific members.
这个区别非常重要。结构并不是一个它自身成员的数组。和数组名不同,当一个结构变量在表达式中使用时,它并不被替换成一个指针。结构变量也无法使用下标来选择特定的成员。
A structure variable is a scalar, so you can perform the same kinds of operations with it that you can with other scalars. Structures may be passed as arguments to functions, they may be returned by functions, and structures of the same type may be assigned to one another. You can declare pointers to structures, take the address of structure variables, and declare arrays of structures. However, we must first cover a few more basics before discussing these issues.
结构变量属于标量类型,所以你可以像对待其他标量类型那样执行相同类型的操作。结构也可以作为传递给函数的参数,它们也可以作为返回值从函数返回,相同类型的结构变量相互之间可以赋值。你可以声明指向结构的指针,取一个结构变量的地址,也可以声明结构数组。但是,在讨论这些话题之前,我们必须知道一些更为基础的东西。