首页 > 其他分享 >C语言 共用体

C语言 共用体

时间:2024-10-02 11:22:29浏览次数:5  
标签:ch union 成员 内存空间 C语言 num 共用

  1. 概念
    • 在C语言中,共用体(Union)是一种特殊的数据类型。它可以在不同的时刻存储不同类型的数据,但所有成员共享同一块内存空间。这与结构体不同,结构体的每个成员都有自己独立的内存空间。
  2. 定义和声明
    • 定义
      • 共用体的定义形式与结构体相似,使用关键字union。例如:
        union Data {
            int num;
            char ch;
            float f;
        };
        
      • 这里定义了一个名为Data的共用体,它有三个成员:int类型的numchar类型的chfloat类型的f
    • 声明
      • 可以在定义共用体之后声明共用体变量。例如:
        union Data data;
        
      • 也可以在定义共用体的同时声明共用体变量:
        union Data {
            int num;
            char ch;
            float f;
        } data;
        
  3. 内存共享特性
    • 由于共用体的所有成员共享同一块内存空间,所以共用体的大小取决于其最大成员的大小。例如,在上述union Data中,如果int占4字节,char占1字节,float占4字节,那么union Data的大小为4字节。
    • 当给共用体的一个成员赋值时,会覆盖共用体中其他成员的值(因为它们共享内存)。例如:
      union Data data;
      data.num = 10;
      printf("num: %d\n", data.num);
      data.ch = 'a';
      printf("ch: %c\n", data.ch);
      // 此时,由于给ch赋值,num的值已经被覆盖,再次访问num的值是不确定的
      
  4. 使用场景
    • 节省内存空间
      • 在某些情况下,如果有一组数据,这些数据不会同时使用,就可以使用共用体来节省内存空间。例如,在一个设备驱动程序中,可能有一个数据结构用于存储设备的状态信息,这个状态信息可能是一个整数表示的错误代码,或者是一个字符表示的设备状态标识,使用共用体可以避免为这两种不同类型的状态信息分别分配独立的内存空间。
    • 数据类型转换
      • 共用体可以用于实现简单的数据类型转换。例如,将一个整数转换为字节数组。可以定义一个共用体,其中一个成员是整数,另一个成员是字符数组,通过给整数成员赋值,然后从字符数组成员中获取字节数据。
  5. 与结构体的区别
    • 内存分配
      • 结构体的每个成员都有自己独立的内存空间,结构体的大小是所有成员大小之和(考虑内存对齐)。而共用体所有成员共享同一块内存空间,其大小取决于最大成员的大小。
    • 数据存储和访问
      • 在结构体中,可以同时存储和访问多个成员的值。在共用体中,同一时刻只能存储和访问一个成员的值,因为成员共享内存,给一个成员赋值会影响其他成员的值。
  6. 注意事项
    • 数据覆盖风险
      • 由于共用体成员共享内存,在使用共用体时要特别注意数据覆盖的问题。如果不小心访问了已经被覆盖的成员的值,可能会得到错误的结果。
    • 类型兼容性
      • 在使用共用体进行数据转换或操作时,要确保数据类型之间的兼容性。例如,不能将一个不兼容的数据类型赋给共用体成员,否则可能会导致程序运行时错误。

标签:ch,union,成员,内存空间,C语言,num,共用
From: https://www.cnblogs.com/androidsuperman/p/18444516

相关文章

  • C语言内存对齐
    概念在C语言中,内存对齐(MemoryAlignment)是一种编译器为了提高内存访问效率而采用的一种数据存储策略。它要求数据在内存中的存储地址是某个特定值(通常是数据类型大小或其倍数)的整数倍。为什么要进行内存对齐提高内存访问速度现代计算机的内存系统是以字节为单位进行组织......
  • 理解C语言之深入理解指针(四)
    目录1.回调函数是什么?2.qsort使⽤举例2.1使⽤qsort函数排序整型数据2.2使⽤qsort排序结构数据3.qsort函数的模拟实现1.回调函数是什么?        回调函数就是⼀个通过函数指针调⽤的函数。        如果你把函数的指针(地址)作为参数传递给另⼀个......
  • C语言开发windows程序主要程序结构
    一、两个函数1.WinMain,WindowsAPI主函数。本次示例中WinMain包含的三个内容: +.注册窗口 +.创建窗口 +.消息循环2.窗口过程(WndProc) 窗口过程,通过窗口过程(WndProc)与用户交互和管理窗口。二、Windows程序示例基于C语言开发的windows图形界面程序/*** title:Windows程......
  • 个人感悟##C语言中的得与失
    个人练习感悟1.三个任意整数从小到大排序#include<stdio.h>#include<stdlib.h>intmain(){inta,b,c;printf(“我可以为您进行从大到小排序,请任意输入三个的整数:”);scanf(“%d%d%d”,&a,&b,&c);if(a>b&&a>c)if(b>c)printf(“%d,%d,%d”,a,b,c);elseif(b<c)......
  • C语言 typedef
    概念在C语言中,typedef是一个关键字,用于为已有的数据类型定义一个新的别名。它本身并不创建新的数据类型,而是给现有的类型赋予一个更方便、更易理解或更符合项目特定需求的名字。基本用法基本数据类型别名例如,为unsignedint定义一个新的别名uint:typedefunsignedint......
  • C语言 结构体
    结构体的概念在C语言中,结构体(struct)是一种用户自定义的数据类型,用于将不同类型的数据组合在一起,形成一个逻辑上相关的整体。它类似于一个容器,可以容纳多种不同类型的数据项。结构体的定义结构体的定义语法如下:struct结构体名{成员类型1成员名1;成员类型2成......
  • C语言 形参和实参
    在C语言中,强制类型转换(强转)可能会导致精度发生变化,具体情况取决于转换的类型。数值类型转换浮点数转换为整数当把浮点数强制转换为整数时,小数部分会被直接截断,精度必然会发生变化。例如:floatnum=3.14;intresult=(int)num;//此时result的值为3,小数部分0.14被截断......
  • c语言中的链接性和作用域
    什么是链接性链接性指的是标识符(如变量、函数)在多个翻译单元(通常是多个源文件)之间共享和可见的能力。链接性决定了标识符的作用范围,即它能在多大范围内被访问或引用链接性无链接性:标识符只能在局部作用域内使用,通常用于局部变量内部链接性:标识符只能在定义它的文件内使用,使......
  • 实验1 C语言输入输出和简单程序编写
    1.实验任务1#include<stdio.h>intmain(){printf("oo\n");printf("<H><H>\n");printf("IIII\n");return0;} 2.实验任务2//从键盘上输入三个数据作为三角形边长,判断其能否构成三角形//构成三......
  • 实验1 C语言输入输出和简单程序编写
    1.实验任务1task1_1.c#include<stdio.h>intmain(){printf("o\n");printf("<H>\n");printf("II\n");printf("o\n");printf("<H>\n");printf("II\n&q......