`

C中的联合体总结

 
阅读更多
转自
http://blog.sina.com.cn/s/blog_662c785901013sq8.html

以前对C语言中的union一知半解,今天专门查阅相关资料总结一下:
1、 联合体union定义:
在C Programming Language 一书中对于联合体是这么描述的:
        1)联合体是一个结构;
        2)它的所有成员相对于基地址的偏移量都为0;
        3)此结构空间要大到足够容纳最"宽"的成员;
        4)其对齐方式要适合其中所有的成员;

当多个数据需要共享内存或者多个数据每次只取其一时,可以利用联合体(union)。由于联合体中的所有成员是共享一段内存的,因此每个成员的存放首地址相对于于联合体变量的基地址的偏移量为0,即所有成员的首地址都是一样的。为了使得所有成员能够共享一段内存,因此该空间必须足够容纳这些成员中最宽的成员。对于这句“对齐方式要适合其中所有的成员”是指其必须符合所有成员的自身对齐方式。(注意对此段对话的理解)
union U1
{
    char s[10];
    int n;
    double d;
};

s占10字节,n占4字节,d占8字节,因此其至少需10字节的空间。然而其实际大小并不是10,用运算符sizeof测试其大小为16.这是因为这里存在字节对齐的问题,10既不能被4整除,也不能被8整除。因此补充字节到16,这样就符合所有成员的自身对齐了。从这里可以看出联合体所占的空间不仅取决于最宽成员,还跟所有成员有关系,即其大小必须满足两个条件:1)大小足够容纳最宽的成员;2)大小能被其包含的所有基本数据类型的大小所整除。
union U2
{
    char s[5];
    int n;
    double d;
};

s占5字节,n占4字节,d占8字节,因此其至少需8字节的空间.而char型占用一个字节,int占用四个字节,double占用8字节,其最小公倍数为8字节,所以U2也就是占用8字节就可以了。
下面结合实例予以说明:
下面是我整理的程序,在VS20O8下面编译通过:
#include

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;
}


这个例子在VC6.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
分享到:
评论

相关推荐

    C#下利用类的方式封装了位操作类,仿照C语言的联合体配合结构体的方式

    总结来说,这个项目是C#中对C语言位操作的一种模拟实现,通过类的方式封装了8位和16位的位操作,提供了一套易于使用的API,使得开发者在不支持直接位操作的C#环境中也能灵活地进行位级别的数据处理。这对于理解和...

    C语言知识点总结

    C语言知识点总结涵盖了初学者在学习C语言过程中需要掌握的众多知识点和易错点。针对类型转换、运算符优先级、数据类型、数组类型、指针等概念,下面将逐一详细展开。 ### 类型转换 类型转换分为隐式类型转换和强制...

    C语言中联合体union的实例详解

    总结,联合体在C语言中主要用于节省内存,尤其是在处理多个类型大小不一但最大尺寸相等的变量时。它的行为可能与其他编程语言中的数据结构(如Java中的List)有所不同,因此理解其工作原理对于编写高效的C代码至关...

    C语言结构体和联合体PPT课件.pptx

    在C语言中,结构体...总结来说,C语言中的结构体和联合体是强大的工具,它们增强了数据表示和处理的能力,使得程序能够更好地管理和操作复杂的数据结构。理解并熟练运用它们是成为一名合格的C程序员的重要步骤。

    C语言总结(技术文章)

    这篇“C语言总结”涵盖了C语言的学习要点、难点解析以及实践经验,旨在帮助初学者更好地理解和掌握这门语言。 一、C语言基础知识 C语言的基础包括变量、数据类型、运算符、流程控制语句等。变量是用来存储数据的...

    C语言学习笔记总结自己备份用

    这份“C语言学习笔记总结”是个人的学习成果集合,包含了对C语言核心概念、语法结构以及编程实践的深度理解和归纳。 一、C语言基础 1. 变量与数据类型:C语言提供了基本的数据类型,如整型(int)、浮点型(float...

    C语言知识点总结.pdf

    7. 结构体与联合体:结构体和联合体是C语言中用来处理复杂数据类型的工具。了解如何定义、使用结构体和联合体对于实现更复杂的项目是必不可少的。 8. 文件操作:文件输入输出是C语言程序中常见的任务,学习如何读写...

    c语言面试题总结

    C语言是一种基础且强大的编程语言,它在计算机...以上就是C语言面试题总结中涵盖的主要知识点,理解和掌握这些内容,将有助于你在面试中展现出扎实的C语言功底。同时,不断实践和项目经验积累也是提升C语言能力的关键。

    c语言大师经典-学习精华总结(高清晰完整版)

    此外,书中还涵盖了预处理器、结构体与联合体、位运算、错误处理等高级主题,这些都是C语言程序员在实际开发中经常遇到的问题。 C++是C语言的扩展,增加了面向对象的特性,如类、对象、继承、多态等。虽然本书主要...

    C语言 985习题总结资料,复习资料

    这篇总结资料是针对985大学学生的学习需求编纂的,旨在帮助他们深入理解和掌握C语言的核心概念及应用技巧。下面将详细阐述这份资料中可能涵盖的知识点,并提供一些学习建议。 一、C语言基础 1. 数据类型:C语言有...

    27、【C语言高级数据类型】联合体和枚举.rar

    总结,联合体和枚举是C语言中提高代码灵活性和效率的重要工具。理解并熟练运用它们,能够帮助开发者编写出更加高效且易于理解的程序。在实际编程中,应根据具体需求选择合适的数据结构,以达到最佳的性能和可维护性...

    c语言学习总结

    【C语言学习总结】 C语言是一种强大的、结构化的编程语言,尤其在嵌入式系统如51单片机中广泛应用。C语言的关键字是其语法的基础,这些关键字不能作为变量或函数名使用,它们提供了语言的基本结构和控制流程。下面...

    C语言之精华总结

    ### C语言之精华总结 #### 一、C语言基础与特点 C语言是一种结构化编程语言,具有高效、灵活的特点,被广泛应用于操作系统、嵌入式系统等领域。它支持多种数据类型、控制结构以及函数定义等特性。在学习C语言时,...

    C语言知识点总结【完美版】.zip

    3. **结构体与联合体**:C语言中的复合数据类型,结构体可以组合不同类型的数据,而联合体则允许多种类型数据共享同一块内存空间。 4. **内存管理**:了解堆栈和堆的区别,掌握动态内存分配(malloc、calloc、...

    C语言面试总结,C++面试总结,嵌入式方向C总结,以及一些常用方法的实现

    在IT行业中,C语言、C++以及嵌入式编程是至关重要的领域,这些技术广泛应用于系统开发、软件工程以及硬件交互。以下是对标题、描述和标签中涉及知识点的详细阐述: 1. **C语言面试总结**: C语言是基础且强大的...

    嵌入式C 精华总结

    extern"C"在C++中用于防止C++对函数名进行名称修饰,保证在C++代码中能正确链接到C语言编写的库函数。在嵌入式开发中,经常需要链接C语言编写的库,因此理解extern"C"的用法对于编写可移植代码至关重要。 void指针...

    计算机等级2级C语言上机百题总结

    计算机等级2级C语言上机百题总结是一个针对全国计算机等级考试二级C语言部分的专项训练资料。...因此,这份“计算机等级2级C语言上机百题总结”是备考过程中不可或缺的参考资料,对于提升考试成绩具有极大的帮助。

    C语言知识点总结【完美版】.rar_C++知识点_C语言_C语言知识点

    这份"C语言知识点总结【完美版】"的文档涵盖了C语言的核心概念,是学习和复习C语言的宝贵资源。以下是对该文档中可能包含的重要知识点的详细解释: 1. **基本数据类型**:C语言有几种基本的数据类型,包括整型(如...

    C语言知识点总结1

    - C语言支持多种数据类型,包括基本类型(如整型、浮点型、字符型等)、枚举类型、空类型以及派生类型(指针、数组、结构体、联合体等)。 #### 输入输出函数 - 标准库函数`puts`用于输出字符串,`gets`用于输入...

Global site tag (gtag.js) - Google Analytics