联合和结构体

本文介绍了联合数据类型的概念及其定义方式,对比了联合与结构在内存分配及数据存储方面的不同。
 1. 联合说明和联合变量定义 
    联合也是一种新的数据类型, 它是一种特殊形式的变量。 
    联合说明和联合变量定义与结构十分相似。其形式为: 
     union 联合名{ 
          数据类型 成员名; 
          数据类型 成员名; 
          ... 
     } 联合变量名; 
    联合表示几个变量公用一个内存位置, 在不同的时间保存不同的数据类型 
和不同长度的变量。
 
    下例表示说明一个联合a_bc: 
     union a_bc{ 
          int i; 
          char mm; 
     }; 
    再用已说明的联合可定义联合变量。 
    例如用上面说明的联合定义一个名为lgc的联合变量, 可写成: 
      union a_bc lgc; 
    在联合变量lgc中, 整型量i和字符mm公用同一内存位置。 
    当一个联合被说明时, 编译程序自动地产生一个变量, 其长度为联合中最大 
的变量长度。 
2 结构和联合有下列区别: 
    1. 结构和联合都是由多个不同的数据类型成员组成, 但在任何同一时刻, 
联合中只存放了一个被选中的成员, 而结构的所有成员都存在。 
    2. 对于联合的不同成员赋值, 将会对其它成员重写,  原来成员的值就不存 
在了, 而对于结构的不同成员赋值是互不影响的。
在C/C++编程中,联合(Union)是一种特殊的自定义数据类型,其成员共享同一块内存空间。初始化联合结构体时,需要注意其特殊性,即只能对其中一个成员进行初始化,且初始化的类型应联合中定义的成员类型相匹配。 ### 联合结构体的定义初始化 联合的定义形式如下: ```c union 联合名 { 成员类型 成员名1; 成员类型 成员名2; // ... }; ``` 例如,定义一个表示不同数据类型的联合: ```c union Data { int i; float f; char str[20]; }; ``` #### 初始化方式 在C语言中,可以使用初始化列表来为联合赋初值。由于联合的成员共享内存空间,因此只能对其中一个成员进行初始化。 ```c union Data data1 = { .i = 10 }; // 初始化整型成员 union Data data2 = { .f = 3.14 }; // 初始化浮点型成员 union Data data3 = { .str = "Hello" }; // 初始化字符数组成员 ``` 在C++中,也可以采用类似的方式进行初始化,但需要注意编译器支持的C++标准版本是否支持这种初始化方式(C++11及以上版本通常支持)。 ```cpp union Data data4 = { 100 }; // 初始化第一个成员(这里是int i) ``` ### 联合结构体的注意事项 - **内存共享**:由于联合的成员共享同一块内存空间,因此对一个成员的修改会影响其他成员的值。 - **大小限制**:联合的大小至少是最大成员的大小,因为联合必须能够容纳最大的成员[^3]。 - **访问权限**:在C++中,联合的默认访问权限结构体相同,默认为`public`,而类的默认访问权限为`private`[^2]。 ### 示例代码 下面是一个完整的示例,展示如何定义并初始化一个联合结构体: ```c #include <stdio.h> #include <string.h> union Data { int i; float f; char str[20]; }; int main() { union Data data; data.i = 10; printf("data.i : %d\n", data.i); data.f = 3.14; printf("data.f : %.2f\n", data.f); strcpy(data.str, "Hello"); printf("data.str : %s\n", data.str); return 0; } ``` 在这个例子中,每次对联合的一个成员进行赋值时,其他成员的值会被覆盖,因为它们共享同一块内存空间[^1]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值