union 分析

本文详细解析了C语言中union共用体和struct结构体的概念及使用方式,通过具体示例展示了不同数据类型如何共享同一段内存空间以及结构体的内存分配原理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#include <stdio.h>

union st
{
    int a;
    char b;
};
int main()
{
    union st s;
    char *p = (char*)&s;
    s.a = 0x3132;
    s.b = 0x33;
    printf("%c", *p);
}

A.1
B.2
C.3
D.不确定 

union是用来定义共用体结构体的,顾名思义就是几个变量共用一个内存空间

union st
{
    int a;
    char b;
};

就是在一块空间内存中存放一个int类型数据或者一个char型数据,也就是说在同一时间内这个结构体里只能够存在一种类型的数据

s.a = 0x3132;  //执行完内存中存放0x3132
s.b = 0x33;    //执行完内存中存放0x33,覆盖掉原先的0x3132
printf("%c", *p); //0x33输出字符 3

答案 “C

 

扩展:

#include <stdio.h>

union U 
{ 
    char st[4]; 
    int i; 
    long l; 
};
struct A 
{ 
    int c;
    union U u; 
}a;
int main()
{
    printf("%d\n", sizeof(a));
    printf("%d\n", sizeof(int));
    printf("%d\n", sizeof(long));
    getchar();
}

A.4
B.5
C.6
D.8

A.4
B.5
C.6
D.8

union共用体变量的内存长度是取各成员变量中最长的

struct结构体变量的内存长度是各成员栈内存长度之和,并且存在内存对齐问题

 

 win32win64linux32linux64
int2444
long4448
union4448
struct8(对齐)8816(对齐)

 

 

 

 

 

 

 

 

 

### SQL UNIONUNION ALL 的区别及用法 #### 差异分析 SQL 中 `UNION` 和 `UNION ALL` 都用于组合两个或多个 `SELECT` 查询的结果集。然而,它们之间存在显著差异。 - **去重处理** `UNION` 自动去除重复记录,而 `UNION ALL` 则保留所有记录,包括重复项[^1]。 - **性能表现** 使用 `UNION ALL` 通常比 `UNION` 更高效,因为后者需要额外的计算来消除重复数据[^1]。 #### 基本语法 以下是两者的标准语法: ```sql -- UNION 示例 SELECT column_name FROM table1 UNION SELECT column_name FROM table2; -- UNION ALL 示例 SELECT column_name FROM table1 UNION ALL SELECT column_name FROM table2; ``` #### 实际应用案例 假设有一个场景:我们需要从两张表中提取相同字段的数据,并希望对比两种方法的效果。 ##### 使用 UNION 如果目标是从两个表中获取唯一值,则应使用 `UNION`: ```sql SELECT name FROM employees UNION SELECT name FROM contractors; ``` 此查询会返回员工和承包商的名字列表,其中任何重复名字只会出现一次。 ##### 使用 UNION ALL 当不需要考虑结果集中是否有重复条目时,可以选择更高效的 `UNION ALL` 方法: ```sql SELECT name FROM employees UNION ALL SELECT name FROM contractors; ``` 这里即使有相同的姓名也会被显示多次[^1]。 #### 性能考量 对于大数据量操作来说,由于 `UNION` 要执行排序与删除重复动作,因此其运行时间可能较长;相比之下,`UNION ALL` 不做这些工作,所以速度更快一些。 --- ### 结论 综上所述,在实际开发过程中可以根据具体需求选择合适的命令——追求精确无误的结果就采用 `UNION` ,注重效率则推荐运用 `UNION ALL` 。两者各有千秋,合理选用才能达到最佳效果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值