Linux C 编程 - Union 结构

有时需要一种数据结构,不同的场合表示不同的数据结构。比如,如果只用一种数据结构来表示人的体重,这种结构就需要有时是整数(50kg), 有时是浮点数(50.5kg)。

C语言提供了Union结构,用来自定义可以灵活变更的数据结构,它内部可以包含多种属性,但同一时间只能有一种属性,因为所有的属性都保存在同一个内存地址,后面写入的属性会覆盖前面的属性,这样做的最大好处是节省空间。

union test{  short a;  float b;  float c;};

上面示例中,union命令定义了一个包含三个属性的数据类型test, 虽然包含三个属性,但是同一时间只能取到一个属性。最后赋值的属性,就是可以取到值得那个属性。

使用时,声明一个该类型的变量

//ex1union test t;t.count = 5;//ex2union test t = {.count=5};//ex3union test t = {5};

上面的代码展示了为Union结构赋值的三种写法,最后一种写法不指定属性名,就会赋值给第一个属性。执行完上面的代码以后,t.count 可以取到值,另外两个属性就取不到值。

printf("t.count is %d
", t.count); //count is 4printf("weight is %f
", t.weight); //空值

如果要让t.weight属性可以取到值,就要先为它赋值

t.weight = 5.5;printf("weight is %f
", t.weight); //weight is 5.5

一旦为其它属性赋值,原先可以取到值得t.count 属性就不再有效了,除了这一点,Union结构的其它用法与Struct结构,基本上是一致的。

Union结构也支持指针运算符->

union test{  short a;  float b;  float c;};union test t;t.count = 5;union test *ptr;ptr = &t;printf("%d
", ptr->count); //5

Union 结构指针与它的属性有关,当前哪个属性能够取到值,它的指针就是对应的数据类型。

Union foo{int a;  float b;} foo_t;int * foo_int_p = (int *)&foo_t;int * foo_float_p = (float *)&foo_t;foo_t.a = 12;printf("%d
", foo_t.a); //12printf("%d
", *foo_int_p); //12foo_t.b = 1.234567;printf("%f
", foo_t.b); //1.234567printf("%f
", *foo_float_p); //1.234567

上面的示例中,&foo_t 是foo结构的指针,它的数据类型完全由当前赋值的属性决定。

typedef命令可以为Union数据类型起别名:

typedef union{  short count;  float weight;  floar volume;} test;

上面的示例中,union命令定义了一个包含三个属性的数据类型,typedef命令为它起别名test。

Union结构的好处,主要是节省空间,它将一段内存空间,重用于不同类型的数据。定义了三个属性,但同一时间只用到一个,使用Union结构就可以节省另外两个属性的空间。Union结构占用的内存长度,等于它内部最长属性的长度。

发表评论
留言与评论(共有 0 条评论) “”
   
验证码:

相关文章

推荐文章