当前位置: 首页 > article >正文

c语言,联合体

一.什么是联合体:

像结构体一样,联合体也是由一个或多个成员变量组成的这些成员变量可以是不同的类型,但编译器只给最大成员分配足够的内存,联合体体内的成员都是公用一块空间的,因此联合体也叫做共同体

二.联合体类型的声明:

union Un//
{
 char c;
 int i;
};
int main()
{
	union Un un={0};//
	printf("%d",sizeof(un));
	return 0;
}
//输出结果为4

和结构体很像其实

三.联合体的特点:

#include <stdio.h>
union Un
{
 char c;
 int i;
};
int main()
{
 union Un un = {0};
 printf("%p\n", &(un.i));
 printf("%p\n", &(un.c));
 printf("%p\n", &un);
 return 0;
}
//最终三个输出结果都指向同一地址,更加说明了联合体内元素成员公用同一地址

四.结构体和结合体储存的区别:

在这里插入图片描述

五.联合体大小的计算:

#include<stdio.h>
union Un1
{
char a[6];
int b;
};
union Un2
{
short c[5];
int d;
};
int main()
{
printf("%d/n",sizeof(Un1));
printf("%d/n",sizeof(Un2));
return 0;
}
//输出结果为8 16

在Un1中虽然int 的类型要比char大,但char有五个元素,也就需要五个字节,在这种情况下,short就可以看做是Un1中最大的成员,那为什么最终输出结果是8而不是五呢?和结构体的规则类似,即使是联合体也需要最终成员元素和偏移值的对齐数为某个整数的倍数。
那么Un2也和Un1一同理,short 有六个元素,需要12个字节的大小,祖自宏结果又需要为某个整数的倍数,所以输出结果为16,而非12,。

六.联合体的应用:

那既然有结构体了,结构体也很方便和联合体也很像为什么还要学习联合体?答案就是在某些场景下联合体所占内存空间更少,可以减少无意义内存的占用。比如
为百货商店内的各类商品(书籍,裙子,玩具)便于管理,而设置一个程序:
解题:
先来分析三者都具有些什么属性:
书籍:价格,名称,作者
裙子:价格,名称,尺码
玩具:价格,名称,材质
三者具有相同的属性为价格,名称,不同的属性为作者,尺码,材质
如果仅仅通过结构体来编程,那最终的编程结果就是三个结构体

struct comm
{
//公共属性
price b;
name o;
//特殊属性
auther k;
size r;
tex z;
};

可是对于上述代码,在调用书籍的三个属性时裙子和玩具的特殊属性所占空间就被浪费掉了,但是如果通过联合体就可以避免空间被浪费

struct comm
{
   double price ;
   char name [20];
   union a
  {
       struct book
       {
       char auther [20];
       };
       struct skirt
       {
        char size [20];
       };
       struct toy
       {
       char tex [20];
       };
   };
};

通过联合体修改后的代码就可在需要调用的书籍的三个属性时不会使裙子和玩具的特殊属性也占用空间了


http://www.kler.cn/a/273462.html

相关文章:

  • 代码随想录第十七天
  • 安科瑞缪BD-AI变送器高精度 多功能 性价比高
  • 【MySQL】 穿透学习数据库理论与知识剖析
  • 江协科技STM32学习- P34 I2C通信外设
  • FET113i-S核心板已支持RISC-V,打造国产化降本的更优解 -飞凌嵌入式
  • 【k8s】-运维技巧-1
  • Jenkins-pipeline流水线构建完钉钉通知
  • 2024西工大数据结构实验(C)
  • Monoxer Programming Contest 2024(AtCoder Beginner Contest 345)(A~C)
  • 外贸网站文章批量生成器
  • Linux ftpwho命令教程:如何查看并管理FTP会话(附实例详解和注意事项)
  • pta 7-29 删除字符串中的子串 C语言
  • java kafka客户端何时设置的kafka消费者默认值
  • Git 常用命令总结
  • 【Selenium(一)】
  • Java语言: 多线程
  • 信号处理--基于正则化聚合的共空间模态(CSP)脑电信号分类
  • 功能齐全的免费 IDE Visual Studio 2022 社区版
  • 基于yolov2深度学习网络的人脸检测matlab仿真,图像来自UMass数据集
  • const,static深度总结——c++穿透式分析
  • 统计-R(相关系数)与R^2(决定系数)
  • [数据集][目标检测]番茄成熟度检测数据集VOC+YOLO格式277张3类别
  • 机器人可反向驱动能力与力控架构
  • 蓝桥杯-python-递归
  • 算法练习第二十五天| 216.组合总和III、17.电话号码的字母组合
  • 云手机的数据安全有保障吗?