预计阅读本页时间:-
结构初始化和存储类时期
在第12章“存储类、链接和内存管理”中我们曾提到,如果初始化一个具有静态存储时期(比如静态外部链接、静态内部链接或静态空链接)的变量,只能使用常量值。这条规则同样也适用于结构。如果初始化一个具有静态存储时期的结构,初始化项目列表中的值必须是常量表达式。如果存储时期是自动的,列表中的值就不必是常量了。
14.3.2 访问结构成员
结构就像是一个“超级数组”。在这个超级数组内,一个元素可以是char类型,下一个元素可以是float类型,再下一个可以是int数组。使用下标可以访问一个数组的各个元素。那么如何访问结构中的各个成员呢?用结构成员运算符点(.)就可以。例如,library.value就是指library的value部分。可以像使用任何其他float变量那样使用library.value。同样,可以像使用一个char数组那样使用library.title。因此,程序中有下面的代码:
以及:
广告:个人专属 VPN,独立 IP,无限流量,多机房切换,还可以屏蔽广告和恶意软件,每月最低仅 5 美元
在本质上,.title、.author和.value在book结构中扮演了下标的角色。
注意,虽然library是一个结构,但是library.value是float类型,可以像使用其他任何float类型变量那样使用它。例如,scanf(“%f”,…)要求float类型变量的地址,而&library.float正好是这样的地址。其中点拥有比&更高的优先级,因此这个表达式和&(library.float)一样。
如果有同样类型的另一个结构变量,可以使用同样的方法:
.title指book结构的第一个成员。注意本章开始处的程序如何用两种不同的格式打印出结构library的内容。这说明了在使用结构成员时拥有的自由。
现在已经拥有这些基础知识,您可以拓宽视野,看看结构的一些分支。您将看到结构数组、以结构为成员的结构、指向结构的指针,以及处理结构的函数。
14.3.3 结构的指定初始化项目
C99支持结构的指定初始化项目,其语法与数组的指定初始化项目相似。只是,结构的指定初始化项目使用点运算符和成员名(而不是方括号和索引值)来标识具体的元素。例如,只初始化book结构的成员value,可以这样做:
可以按照任意的顺序使用指定初始化项目:
正像数组一样,跟在一个指定初始化项目之后的常规初始化项目为跟在指定成员后的成员提供了初始值。另外,对特定成员的最后一次赋值是它实际获得的值。例如,考虑下列声明:
这将把值0.25赋给成员value,因为它在结构声明中紧跟在author成员之后。新的值0.25代替了早先的赋值18.90。既然您已经掌握了这些基础的内容,现在,您可以拓宽学习内容来了解结构的一些相关类型。我们将学习结构数组、嵌套结构、指向结构的指针和处理结构的函数。