关于结构体和联合体的认知

结构体的定义和初始化

  • 声明结构体类型成员再定义此结构体的名称.
  • 可以在声明类型的同时定义变量并直接初始化(也可以不初始化只定义变量).
  • 可以直接定义结构体类型变量(无类型名,即匿名结构体声明).
  • 只有在定义结构体变量的时候才可以初始化.

结构体类型和结构体变量关系
– 结构体类型: 指定了一个结构体类型,它相当于一个模型,但其中并无具体数据,系统对之也不分配实际内存单元.可以看作类似变量的声明,但实际是定义.
– 结构体变量: 根据定义的结构体类型(内部成员的类型,数量和大小)为之分配空间.

结构体的赋值

普通结构体在使用时候,通过.运算符操作成员.

如果是指针结构体变量,则通过->运算符操作成员.

位域

位域(位段)的特点:
1. 位域声明和结构体类似.
2. 位域的成员必须是整型类型(包括枚举类型),如:int,unsigned int,short,unsigned short,long等;
3. 位域的成员名后边有一个冒号和一个数字: type [var]: digits,代表所占大小.

位域的优点:
– 能够把长度为奇数的数据包装在一起,节省存储空间.
– 方便访问整形值的部分内容.

位域的缺点:
– 移植性较差,位域的成员在内存中是从左到右分配还是从右到左分配是根据系统来定.
– 由于取地址操作符不能应用在位域上,所以没有能指向位域的指针.估计因为位域的存放位置不是按照字节为单位来存放的.
– 位域也不能是静态成员.

联合体

联合体又称共同体.使用关键字union修饰.

  • 联合体是一个能在同一个存储空间存储不同类型数据的类型.
  • 联合体所占的内存长度等于其最长成员的长度.
  • 同一内存段可以用来存放几种不同类型的成员,但每一瞬时只有一种在起作用.
  • 共用体变量中起作用的成员是最后一次存放的成员,在存入一个新的成员后原有的成员的值会被覆盖.
  • 共用体变量的地址和它的各成员的地址都是同一地址.