结构体和共同体
结构体
定义多个不同类型的成员变量组合在一起,以实现复杂的数据结构。
格式:
struct [标签名] {
类型 变量名;
类型 变量名;
...
} [ 变量1={初始化}, 变量2 ...];
或者:
typedef struct{
类型 变量名;
类型 变量名;
...
} [标签名];
示例:
struct Books {
int id;
char title[50];
char author[50];
} book;
当两个结构体互相包含,则需要对其中一个结构体进行声明:
//声明
struct B;
//结构体A指向结构体B
struct A{
struct B *partner;
};
struct B{
struct A *partner;
};
位域
有些信息在存储时,并不需要占用一个完整数据空间,而只需占几个或一个二进制位。所谓"位域"是把字节中的二进位划分为几个不同的区域,并说明每个区域的位数。
格式:整型 变量名 : 宽度
struct {
int a:8;
unsigned b:16; //等同于 unsigned int
int :4; // 空域,会空出4位的空间
int :4; // 空域,会空出4位的空间
signed char c;//char 保存的也是整数
} code;
值得注意的是宽度表示是的所占二进制位,不能超过它自身的类型。
如: char 占1个字节,也就是8位,所以宽度不能超过8,即: char a:9 会报错。
如: int 占4个字节,也就是32位,所以宽度不能超过32,即: int a:33 会报错。
整个结构体所占内存大小是最大的那数据类型的整数倍.
{
int a:32;
char b:8;
}
共计 32 + 8 = 40 / 8 = 5字节,而成员变量中占用空间最大的是int型,一个int占4个字节,而4个字节存不下,得再扩展一个int空间,所以就占8个字节了。可以通过 sizeof(变量) 去验证结果;
共用体
定义多个不同类型的成员变量共用相同的内存空间,而内存空间只能轮流使用,内存空间大小取决于最大的那个成员变量。
union [标签名] {
类型 变量名;
类型 变量名;
...
} [变量1, 变量2 ...];
示例:
union Student { char name[10]; int age; float weight; } boy; int main( ) { //正确使用 boy.name = "Tom"; printf( "男孩名字: %s \n", boy.name); boy.age = 20; printf( "男孩年龄: %d \n", boy.age); boy.weight = 64.5 printf( "男孩体重: %f \n", boy.weight); //错误使用 union Student girl; girl.name = "Ailsa"; girl.age = 20; girl.weight = 46.5 printf( "女孩: %s %d %f \n", girl.name, girl.age, girl.weight); }