结构体和共同体

结构体
定义多个不同类型的成员变量组合在一起,以实现复杂的数据结构。
格式:
 
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位的空间
    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 
", boy.name);
    
   boy.age = 20;
   printf( "男孩年龄: %d 
", boy.age);
   
   boy.weight = 64.5
   printf( "男孩体重: %f 
", boy.weight);
 
   //错误使用
   union Student girl; 
   girl.name = "Ailsa";
   girl.age = 20;
   girl.weight = 46.5
   
   printf( "女孩: %s  %d  %f 
", girl.name, girl.age, girl.weight);
  
}
原文地址:https://www.cnblogs.com/zbseoag/p/10716436.html