预计阅读本页时间:-
词语“结构”(structure)有两个意思。一个意思是“结构设计”,这个我们刚刚已经讨论过了。结构设计告诉编译器如何表示数据,但是它没有让计算机为数据分配空间。下一步是创建一个“结构变量”,即这个词的第二个意思。程序中创建结构变量的那一行如下:
广告:个人专属 VPN,独立 IP,无限流量,多机房切换,还可以屏蔽广告和恶意软件,每月最低仅 5 美元
看到这条指令,编译器会创建一个变量library。编译器使用book模板为该变量分配空间:一个具有MAXTITL个元素的char数组,一个具有MAXAUTL个元素的char数组和一个float变量。这些存储空间是以一个名字library被结合在一起的(请参见图14.1)(下一节将说明在需要的时候如何分解这个存储空间)。
图14.1 结构的存储分配
在结构变量的声明中,struct book所起的作用就像int或float在较简单的声明中的作用一样。例如,可以定义两个struct book类型的变量,甚或可以定义一个指向该结构的指针:
结构变量doyle和panshin均包含title、author和value部分。指针prbook可以指向doyle、panshin,或任何其他book结构变量。实际上,book结构的声明创建了一个名为struct book的新类型。就计算机而言,下面的声明:
是以下声明的简化:
换句话说,声明结构的过程和定义结构变量的过程可以被合并成一步。如下所示,将声明和变量定义合并在一起,是不需要使用标记的一种情况。
然而,如果您想多次使用一个结构模板,就需要使用带有标记的形式;或者您也可以使用本章后面部分将要讲到的typedef。
在这个例子中,定义结构变量时没有进行初始化。现在我们来看看初始化。
14.3.1 初始化结构
您已经知道如何初始化变量和数组:
结构变量也能这样被初始化吗?是的,当然。要初始化一个结构变量(对于ANSI C,可以是任何一种存储类;但对于ANSI之前的C,不能是自动变量),可以使用与初始化数组相似的语法:
简言之,使用一个用花括号括起来的、逗号分隔的初始化项目列表进行初始化。每个初始化项目必须和要初始化的结构成员类型相匹配。因此,可以将title成员初始化为字符串,将value成员初始化为数字。要使这种关联更明显些,可以把每个成员的初始化项目写在单独的一行中。但是,编译器所需要的只是用逗号分隔各个成员的初始化项目就可以了。