结构和联合

结构

属于标量类型

struct SAMPLE {
  int age;
  char *name;
} y[20], *z;

# 之后可以
struct SAMPLE x;

//合并
struct INIT {
  int age;
  short b[10];
  struct SAMPLE c;
} x = {
    10,
    {1,2,3}
    {25, 'a'}
}
struct SELF; # 在互相引用时,可以先进行不完整声明

struct SELF_REF {
    int a;
    # struct SELF_REF b # 非法,会无限循环b
    struct SELF_REF *b; # 合法,因为指针大小已知,而且*b一般会指向另一个结构  
    int c;
}

存储

结构的地址和结构第一个成员变量的地址是一样的(可以通过强转进行切换)

不能通过第一个变量,+1来直接访问下一个变量

结构成员会有边界对齐的操作,而系统原因,结构的初始位置必须和第一个成员一样,既不能有空白。

可以通过offsetof 宏获悉结构中制定成员的存储偏移。

位段(bit-field)

声明和结构类似,成员实际上存储于一个或多个整型变量

可以指定每个成员的位数,

移植性不高(比如int的解释,比如最大位数的兼容,比如实现时地址是ltr或者rtl)

struct CHAR {
    // 类型只能是int , unsigned int, signed int
    unsigned ch : 7;
    unsigned font : 6;
    unsigned size : 19; //16位机器将报错
}

还有一个使用的目的是,每个位段成员都很小,相对于移位操作,可以可读性更高的访问:

看原文吧。。

联合

union {
   float f;
   int i;
} fi = {5.0};

fi.f = 3.14159;
printf("%d\n", fi.i);

声明和结构类似,但是i和f 写入/读取的是内存中的同一个位置 初始化时只能初始化为第一个成员的类型

联合的长度是最长成员的长度

Last updated

Was this helpful?