【Struct(结构体)杂谈之二】Struct(结构体)的声明、定义及初始化
上一篇里我们讲了为什么我们要引入Struct这个数据类型,我们了解到Struct是一种聚合数据类型,是为了用户描述和解释一些事物的方便而提出的,Struct是一种用户自定义数据类型,如下图所示:

其实从理论上讲,数据类型就是人为制订的如何解释内存中的二进制数的协议,也就是说一个数字对应着一块内存(可能4字节,也可能20字节),而这个数字的类型则是附加信息,以告诉编译器当发现有对那块内存的操作语句(即某种操作符)时,要如何编写机器指令以实现那个操作。比如两个char类型的数字进行加法操作符操作,编译器编译出来的机器指令就和两个long类型的数字进行加法操作的不一样,也就是所谓的“如何解释内存中的二进制数的协议”。
具体到我们之前的例子来说,只是指定了一种结构体类型,它相当于一个模型,但其中并无具体数据,系统也不为之分配实际的内存单元。为了能在程序中使用结构体类型的数据,应当定义结构体类型的变量,并在其中存放具体的数据。
本篇将详细对Struct的声明、定义和初始化进行分析。
要了解Struct的声明,我们需要首先了解声明的含义到底是什么?
---声明是要求编译器产生映射元素的语句。所谓的映射元素,就是前面介绍过的变量及函数,都只有3栏(或3个字段):类型栏、名字栏和地址栏(成员变量类型的这一栏就放偏移值)。即编译器每当看到声明语句,就生成一个映射元素,并且将对应的地址栏空着,然后留下一些信息以告诉连接器——此*.obj文件(编译器编译源文件后生成的文件)需要一些符号,将这些符号找到后再修改并完善此*.obj文件,最后链接。
具体到上一回的例子,我们假如在另外一个源文件中需要使用struct ExpectedBoyFriend,那么就需要在该源文件使用之前处使用下面的声明语句:
struct Book gift = { .value = 18.90, .author = \"hilionna pestle\", 0.25}; 这将把值0.25赋给成员value,因为它在结构声明中紧跟在author成员之后。新的值0.25代替了早先的赋值18.90。