/*摘自《C程序设计语言·第二版》*/
- 结构的基本知识
关键字struct引入结构声明。结构声明由包含在花括号内的一系列声明组成。struct后面的名字是可选的,称为结构标记(这里为point)。结构标记用于为结构命名,在定义之后,结果标记就代表花括号内的声明,可以用它作为该声明的简写形式。
结构中的变量称为成员。结构的成员,结构标记和普通变量(即非成员)可以采用相同的名字,他们之间不会冲突。另外,不同结构中的成员可以使用相同的名字。
struct声明定义了一种数据类型。在标志结构成员表结束的右花括号之后可以跟一个变量表,这与其他基本类型的变量声明是相同的,如
从语法角度来说,这用方式的声明与以下声明类似
如果结构声明的后面不带变量表,则不需要为它分配存储空间,他仅仅描述了一个结构的模板或轮廓。但是,如果结构声明中带有标记,那么在以后定义结构实例时便可以使用该标记定义。例如,对于上面给出的结构声明point,语句
在表达式中,可以通过下列形式引用某个特定结构中的成员:
结构名.成员
其中结构成员运算符“.”将结构名与成员名连接起来。例如,可用下列语句打印点pt的坐标:
或者通过下列代码计算原点(0,0)到点pt的距离:
2.结构与函数
结构的合法操作只有几种:作为一个整体复制和赋值,通过&运算符取地址,访问其成员。其中,复制和赋值包括向函数传递参数以及从函数返回值。结构之间不可以进行比较。可以用一个常量成员值列表初始化结构,自动结构也可以通过赋值进行初始化。
接下来用三种方法传递结构:一是分别传各个结构成员,二是传递整个结构,三是传递指向结构的指针。
首先看一下函数makepoint,它带有两个整型参数,并返回一个point类型结构:
现在可以用makepoint函数动态地初始化任意结构,也可以向函数提供结构类型的参数,例如:
其中,函数的参数和返回值都是结构类型。
假定p是一个指向结构的指针,可以用
p -> 结构成员
这种形式引用相应的结构成员。
3.类型定义(typedef)
C语言提供了一个称为 typedef 的功能,用它来建立新的数据类型名,例如,声明
将Lenght定义为与int具有同等意义的名字。类型Lenght可用于类型声明,类型转换等,它和类型int完全相同,例如:
其中,将String定义为与char*或字符指针同义,此后便可以在类型声明和类型转换中使用String。
4.联合
联合是可以(在不同时刻)保存不同类型和长度的对象和变量,编译器负责跟踪对象的长度和对其要求。联合提供了一种方式,以在单块存储区中管理不同类型的数据,而不需要在程序中嵌入任何机器相关的信息。
变量u必须足够大,以保存这三种类型中最大的一种,具体长度同具体的实现有关。这些类型中的任何一种类型的对象都可以付给u,且可使用在随后的表达式中,但必须保证是一致的:读取的类型必须是最近一次存入的类型。程序员负责跟踪当前保存在联合中的类型。如果保存的类型与读取的类型不一致,其结果取决于具体的实现。
可以通过下列语法访问联合中的成员:
联合名.成员名
或
联合指针 -> 成员
它与访问结构的方式相同。如果用变量utype跟踪保存在u中的当前数据类型,则可以像下面这样使用联合:
/*这本书是真的好兄弟们*/