C的struct, union, enum

来源:互联网 发布:数据基础统计 编辑:程序博客网 时间:2024/05/17 04:44
结构体类型的变量的成员变量可以具有不同的类型,通过成员变量的名称获取指定成员。
联合类型的变量的所有成员都共享同一存储空间,每次只能存储一个成员。
枚举类型是一组命名了的整数值。 
一、结构体 struct
1、结构声明
struct tag { member-list } variable-list;

struct {
    int a;
    char b;
    float c;
} x;
// 创建了一个名叫x的变量,包含三个成员:一个整数,一个字符,一个浮点数
struct {
    int a;
    char b;
    float c;
} y[20], *z;
// 创建了y和z, y是一个数组,包含了20个结构。z是一个指针,指向这个类型的结构
z = &x;  // 非法的,编译器认为这两个声明是截然不同的类型。
标签允许多个声明使用同一个成员列表,并且创建同一种类型的结构。
//声明把标签SIMPLE和这个成员列表联系在一起。该声明并没有提供变量列表,所以它并未创建任何变量
struct SIMPLE{
    int a;
    char b;
    float c;
};
// x、y、z是同一种类型的结构变量
struct SIMPLE x;
struct SIMPLE y[20],*z;
使用typedef创建一种新的结构类型
//声明结构时可以用typedef创建一种新的类型。
typedef struct {
    int a;
    char b;
    float c;
} Simple;
// Simple是个类型名而不是个结构标签
Simple x;
Simple y[20],*z;
2、结构的初始化
struct INIT_EX {
    int a;
    short b[10];
    Simple c;
} x={
    10,
    {1,2,3,4,5},
    {25,'x',1.9}
};
3、结构成员的访问
结构体类型变量.成员变量
4、结构、指针和成员
typedef struct {
    int a;
    short b[2];
} Ex2;
typedef struct EX_TAG {
    int a;
    char b[3];
    Ex2 c;
    struct EX_TAG *d;  // 结构的自引用。(1)只能是指针不能是结构;(2)定义结构标签来声明这个指针
} Ex;
Ex x={10,"Hi",{5,{-1,25}},0};
Ex *px=&x;
px + 1    // 非法的
*px       // 指向整个Ex结构体
*px + 1   // 非法的
*(px+1)   // 非法的
px->a     // 10
px->b[1]  // 数组b的第2个元素 i
px->c.a   // 5
*px->c.b  // px->c的结果是结构c,px->c.b访问结构c的成员b。b是一个数组,所以px->c.b是一个指针,指向数组的第1个元素,*px->c.b就是b[1],即-1
px->d     // 访问指针成员,0

二、联合 union
联合类型的变量可以由具有不同类型的一个或多个成员变量构成,但编译器只为联合类型的变量分配最大的成员变量需要的内存空间。
联合的所有成员引用的是内存中的相同位置
union是固定首地址,按最大需求开辟一段内存空间
1、联合声明
union {
    类型 成员变量1;
    类型 成员变量2;
} 联合变量;
2、联合初始化
联合类型的变量初始化,只有第一个成员可以获得初始值。
union {
    类型 成员变量1;
    类型 成员变量2;
} 变量 = {成员变量1的值};
把联合类型的变量x的第一个成员变量a初始化为5。
union {
    int   a;
    float b;
    char  c[4];
} x = {5};
3、联合的主要应用
(1)通过在结构体类型(struct)中使用联合类型(union)节省空间。
(2)使用联合类型的变量作为数组元素构建含有不同类型的混合的数据结构。
# sizeof(struct s1) = 0
// 只有类型,没有变量
struct s1{
    union u{ int i; }; 
    struct ss1{ int i; }; 
};
# sizeof(struct s2) = 8
// 定义一个union变量和一个struct变量
struct s2{
    union { int i; }; 
    struct { int i; }; 
};
# sizeof(struct s3) = 8
// 定义联合变量su33,结构变量ss33
struct s3{//the same to s2
    union su3{ int i; } su33; 
    struct ss3{ int i; } ss33; 
};

union su4{ int i; }; 
struct ss4{ int i; };
# sizeof(struct s4) = 8
// 定义联合变量su44,结构变量ss44
struct s4{//the same to s3 
    union su4 su44; 
    struct ss4 ss44; 
};
# sizeof(struct s3) = 0
// 声明联合标签su4,结构标签ss4
struct s5{//the same to s1 
    union su4; 
    struct ss4; 
};
# sizeof(struct s3) = 0
// int; 只有声明,没有定义
struct s6{//the same to s1
    union { int; }; 
    struct { int; }; 
};

三、枚举 enum
枚举的值可以作为整数使用,但不要把整数作为枚举的值。
enum {
    枚举常量1,
    枚举常量2,
    ...
    枚举常量n
} 枚举变量1,枚举变量2;

参考:
http://blog.csdn.net/huqinweI987/article/details/23597091
http://blog.csdn.net/lemonrabbit1987/article/details/47803377