C++ 中的union

union myun
{
struct { int x; int y; int z; }u;
int k;
}a;
int main()
{
a.u.x =4;
a.u.y =5;
a.u.z =6;
a.k = 0;
printf("%d %d %d\n",a.u.x,a.u.y,a.u.z);
return 0;//输出 0,5,6
}

union类型是共享内存的,以size最大的结构作为自己的大小,这样的话,myun这个结构就包含u这个结构体,而大小也等于u这个结构体 的大小,在内存中的排列为声明的顺序x,y,z从低到高,然后赋值的时候,在内存中,就是x的位置放置4,y的位置放置5,z的位置放置6,现在对k赋 值,对k的赋值因为是union,要共享内存,所以从union的首地址开始放置,首地址开始的位置其实是x的位置,这样原来内存中x的位置就被k所赋的 值代替了,就变为0了,这个时候要进行打印,就直接看内存里就行了,x的位置也就是k的位置是0,而y,z的位置的值没有改变,所以应该是0,5,6

VS2010亲自试了下,确实如此

#include "stdafx.h"
#include <iostream>
int _tmain(int argc, _TCHAR* argv[])
{
    union{
      struct {
      int a;int b;int c;      }a;
        int k;
    }b;

    b.a.a=1;
    b.a.b=2;
    b.a.c=3;
    b.k=9;
    int aa;
    std::cout<<b.a.a<<b.a.b<<b.a.c;
    std::cin>>aa;
    return 0;   //输出 923
}
时间: 2024-11-14 12:25:49

C++ 中的union的相关文章

SqlServer中的UNION操作符在合并数据时去重的原理以及UNION运算符查询结果默认排序的问题

原文:SqlServer中的UNION操作符在合并数据时去重的原理以及UNION运算符查询结果默认排序的问题 本文出处:http://www.cnblogs.com/wy123/p/7884986.html 周围又有人在讨论UNION和UNION ALL,对于UNION和UNION ALL,网上说的最多的就是性能问题(实在不想说出来这句话:UNION ALL比UNION快)其实根本不想炒UNION和UNION ALL这碗剩饭了,每次看到网上说用这个不用那个,列举的一条一条的那种文章,只要看到说U

Boost--variant (C++中的union)

union联合体类型的问题 只能用于内部类型,这使得union在C++中几乎没有用 所以boost提供了variant,相当于是C++中的union #include "boost/variant.hpp" #include <vector> #include <iostream> #include <array> #include <string> using namespace std; class DoubleVisitor : p

Sql中的union和union all的讲解

SQL UNION 和 UNION ALL操作符 UNION 操作符用于合并两个或多个 SELECT 语句的结果集. 请注意,UNION 内部的 SELECT 语句必须拥有相同数量的列.列也必须拥有相似的数据类型.同时,每条 SELECT 语句中的列的顺序必须相同. 假设我们有一个表Student,包括以下字段与数据: drop table student; create table student(id int primary key,name nvarchar2(50) not null,s

SQL中的union

在SQL中,如果我们查询一个班级的考试成绩数据,再统计考试成绩的总和,我们使用以下两条语句: select StudentName,Grade from Student select '总成绩',SUM(Grade)from Student 执行此两条代码,结果会分别显示在两个表中,我们该如何使两条数据整合在一起?这就用到了union集合运算符,union对两个集合进行操作,两个集合需要有相同的列名,两个集合的列类型应该是相符的,最终列名以第一个集合列名为准. 我们上面的代码片段恰好符合合并的要

[转]C#Linq中的Union All/Union/Intersect和Top/Bottom和Paging和SqlMethods,skip,take,takewhile,skipwhile,编译查询等

本文转自:http://www.cnblogs.com/suizhikuo/p/3791799.html 我们继续讲解LINQ to SQL语句,这篇我们来讨论Union All/Union/Intersect操作和Top/Bottom操作和Paging操作和SqlMethods操作 . Union All/Union/Intersect操作 适用场景:对两个集合的处理,例如追加.合并.取相同项.相交项等等. Concat(连接) 说明:连接不同的集合,不会自动过滤相同项:延迟. 1.简单形式:

sql中的union,except及intersect

1.union: 使用union:组合两个结果表,消除重复的记录. 使用union all:组合两个结果表(重复不去重). 2.except: 使用except:在table1中但不在table2中的行,同时消除重复行. 使用except all:不消除重复行. 3.intersect: 获取两个结果集的并集. 版权声明:本文为博主原创文章,未经博主允许不得转载.

Check类中的union,excl,diff,intersect

定义一些类,这些类之间有父子关系,如下: class Father{} class Son1 extends Father{} class Son2 extends Father{} class Top{} class Middle extends Top{} class Bottom extends Middle{} 1.incl()方法 源代码如下: /** Add type set to given type list, unless * it is a subclass of some

Java中的Union Types和Intersection Types

前言 Union Type和Intersection Type都是将多个类型结合起来的一个等价的"类型",它们并非是实际存在的类型. Union Type Union type(联合类型)使用比特或运算符|进行构造: A | B | C 注意:用|符号来构造Union Type类型只是Java语言的规定,|在这里不代表比特或的含义. 上例中,A | B | C是一个Union type,Union type的含义就是"或",只要满足其中一个即可. 实例:捕获多个异常

MySQL中使用union all获得并集的排序

项目中有时候因为某些不可逆转的原因使得表中存储的数据难以满足在页面中的展示要求.之前的项目上有文章内容的展示功能,文章分为三个状态待发布.已发布.已下线.他们在数据表中判断状态的字段(PROMOTE_STATUS)值分别为0.1.2.一开始的需求是文章只展示待发布和已发布,已发布排在待发布前面,并且两种状态下在根据自己的情况去排序.这样的实现比较简单,如下的order by语句就可以实现了. order by  PROMOTE_STATUS desc ,SEQUENCE_ID desc.....