C语言 共用体union

ChatGPT 3.5 国内中文镜像站免费使用啦

零基础 C/C++ 学习路线推荐 : C/C++ 学习目录 >> C 语言基础入门

零基础 C/C++ 学习路线推荐 : C/C++ 学习目录 >> C++ 面向对象

零基础 C/C++ 学习路线推荐 : C/C++ 学习目录 >> C++ 设计模式

零基础 C/C++ 学习路线推荐 : C/C++ 学习目录 >> C++ STL

零基础 C/C++ 学习路线推荐 : C/C++ 学习目录 >> C/C++ 技术杂谈

零基础 C/C++ 学习路线推荐 : C/C++ 学习目录 >> C/C++ 常用函数


一.共用体union简介

C 语言编程中,变量的定义是分配存储空间的过程,一般情况下,每个变量都具有自己的存储空间,使用联合体可以实现在同一个内存空间中存储不同的数据类型,所有数据共用一块内存

C 语言中,定义联合体的关键字为 union ,定义一个联合体类型的一般形式如下:

union 联合名
{
  成员表
};

成员表中可以包含若干成员,成员的一般形式为:类型说明符 成员名,联合体类型占用的字节数与成员中最大数据类型占用的字节数一致。

结构体和联合体的区别在于,结构体的各个成员会占用不同的内存,互相之间没有影响,而联合体的所有成员占用同一段内存,修改一个成员会影响其余所有成员。


二.共用体union定义变量

1.先创建共用体 union ,再定义变量

//创建联合体模板union data
union data {
  int a;
  char b;
  double c;
};

//使用联合体模板定义变量a,b,c
union data a, b, c;

2.同时创建共用体 union 和变量

//创建联合体模板的同时定义变量
union data {
  int a;
  char b;
  double c;
} a, b;

3.使用 typedef 定义

//联合体模板union data重命名为data_u类型
typedef union data {
  int a;
  char b;
  double c;
} data_u;

//使用data_u类型去创建变量
data_u a, b;

注意与方案一的区别,使用 typedef 可以再定义变量前忽略 union


三.共用体union变量初始化

data_u a;
a.a = 10;

//将一个联合体初始化为同类型的联合体
data_u b = a;

//初始化联合体的第一个成员
data_u c = {20};

//指定初始化某个成员
data_u d = {.a = 30};

四.共用体union实战

#include <stdio.h>

typedef union data {
    int a;
    char b;
    double c;
} data_u;

int main(int argc, char *argv[])
{
    data_u a = {.a = 100};//指定初始化某个成员
    
    printf("a.a = %d\n", a.a);
    
    return 0;
}

五.共用体union和结构体struct区别

结构体和共用体的区别在于:结构体的各个成员会占用不同的内存,互相之间没有影响;而共用体的所有成员占用同一段内存,修改一个成员会影响其余所有成员。

结构体占用的内存大于等于所有成员占用的内存的总和(成员之间可能会存在缝隙),共用体占用的内存等于最长的成员占用的内存。共用体使用了内存覆盖技术,同一时刻只能保存一个成员的值,如果对新的成员赋值,就会把原来成员的值覆盖掉。


六.猜你喜欢

  1. C语言 数组下标越界和内存溢出区别
  2. C语言 使用指针遍历数组
  3. C语言 指针和数组区别
  4. C语言 指针数组和数组指针区别
  5. C语言 野指针
  6. C语言 函数值传递和址传递
  7. C语言 函数不定长参数
  8. C语言 函数指针
  9. C语言 指针函数
  10. C语言 回调函数 callback
  11. C语言 #pragma once
  12. C语言 #include <> 与 #include “” 区别
  13. C语言 const 修饰函数参数
  14. C语言 const 和 define 区别
  15. C语言 #运算符
  16. C语言 ##运算符
  17. C语言 __VA_ARGS__
  18. C语言 ##__VA_ARGS__
  19. C语言 函数不定长参数 ##__VA_ARGS__经典案例
  20. C语言 va_start / va_end / va_arg 自定义 printf 函数
  21. C语言 main 函数参数 main(int argc, char *argv[])
  22. C语言 全局变量和局部变量区别
  23. C语言 static
  24. C语言 extern
  25. C/C++ Unicode 和多字节区别
  26. C/C++ wprintf 输出中文乱码
  27. C/C++ char 和 wchar_t 相互转换
  28. C/C++ NaN(Not a Number)
  29. C语言 枚举enum简介(一)
  30. C语言 枚举enum声明变量和使用(二)
  31. C语言 共用体union

ChatGPT 3.5 国内中文镜像站免费使用啦
© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容