结构
结构就是一种把数据项组合在一起的数据结构,在c语言中,进行组合的通常方法就是把需要组合的东西放在花括号里:{内容...}
关键字struct放在左花括号前面,以便编译器能够从程序块中认出它:
struct { ... };
结构的内容可以是任何其他数组声明:单个数据项、数组、其他结构、指针等。我们可以在结构的定义后面跟一些变量名,表示这些变量的类型是这个结构的。
另外可以在struct关键字后面加一个可选的结构标签
struct tag {内容...};
这样就可以在将来的声明中用struct tag作为 struct {内容…}的简写形式了。
结构体中也允许存在位段、无名字段以及字对齐所需的填充字段,这些都是通过在字段的声明后加一个冒号以及一个字段的位常的整数来实现的。
这种用法通常被称作"深入逻辑元件的编程",位段的类型必须是int,unisigned int或者signed int。
联合
union 在许多其他语言中被称作变体记录。它的外表与结构相似,但在内存布局上存在关键性的区别。
在结构中,每个成员依次存储,而在联合中,所有的成员都从便宜地址零开始存储。这样,每个成员的位置都重叠在一起,在某一个时刻,只有一个成员真正存储于该地址。
联合的外观同结构一样,只是用关键字union取代了关键字struct。
联合一般用来节省空间,因为有些数据项是不可能同时出现的,如果同时存储它们,会很浪费资源。
枚举
枚举enum通过一种简单的途径,把一串名字与一串整型值联系在一起
enum tag { 内容... } var;
例如:
enum sizes {small = 7, medium, large = 10, humungous};
缺省情况下,整形值从零开始,如果对列表中的某个标识符进行了赋值,那么紧接其后的那个标识符的值就比所赋的值大1,然后类推。
枚举的一个优点就是#define定义的名字一般在编译时丢弃,而枚举名字则通常一直在调试器中可见,可以在调试代码时使用它们。