结构是一个或多个变量的集合,这些变量可能为不同的类型,为了处理的方便而将这些变量组织在一个名字之下。
定义
struct point {
int x;
int y;
};
struct point a;
a = {1, 2};
a.x = 3;
a.y = 3;
struct point b;
b.x = 5;
b.y = a.y;
struct {
int a;
struct point pt;
} name1, name2;
关键字struct指明这是一个结构
point是结构标记,用于为结构命名,代表了大括号中声明,是可选的
大括号中定义的变量称为成员。
a是一个struct point 类型的变量,并通过复制初始化。
通过结构名.成员引用某个特定结构中的成员
也可以省略结构标记,在大括号后直接声明变量
结构内可以将其他结构作为成员
操作
作为一个整体复制和赋值
用一个常量成员值列表初始化结构
结构之间不可以进行比较
通过&运算符取地址
访问其成员
长度
结构的长度不一定等于各成员长度的和
因为不同的对象有不同的对齐要求,因此,结构中可能会出现未命名的空穴(hole)
使用sizeof可以返回正确的对性长度
结构指针
struct point origin, *pp;
pp = &origin;
(*pp).x = 1;
pp->y = 2;
pp是一个指向struct point类型对象的指针
pp指向origin
pp-> 是 (*pp). 的简写形式
结构成员中不可以包含本结构类型的实例,但是可以包含指向本结构类型的指针。
类型定义(typeof)
typeof用来建立新的数据类型名
例如:typeof char *String
将String 定义为char类型的指针
联合
在(不同时刻)保存不同类型和长度的对象的变量
在单块存储区中管理不同类型的数据
实际上,联合就是一个结构,它的所有成员成员相对于基地址的偏移量都为0.
联合的空间要大到足够容纳最“宽”的成员
联合只能用其第一个成员类型的值进行初始化。
每个时刻联合中只能存储一个数据。数据的类型在联合中定义。
读取的类型必须是最近一次存入的类型,程序员负责跟踪当前保存在联合中的类型。
union u_tag {
int ival;
float fval;
char *sval;
} u;
u.ival = 2;
位字段
“字”(word)是单个的存储单元
位字段是“字”中相邻位的集合
struct {
unsigned int is_keyword : 1;
unsigned int is_extern : 1;
unsigned int is_static : 1;
} flags;
定义了一个变量flags,它包含3个一位的字段。
冒号后的数字表示字段的宽度(用二进制位数表示)