作者的话

本文介绍联合体的定义、如何使用联合体,包括联合体的声明、联合体变量创建、联合体内存使用,以及联合体大小的计算,最后附上用联合体判断当前环境是大端还是小端的方法。


联合体的定义

联合体,又叫共用体,是由程序员自己设定的一种自定义数据类型。和结构体一样,联合体也拥有许多成员变量,不过其所有的成员变量占用空间的地址都相同,即所有成员使用同一份空间

如何使用联合体

1)联合体声明

union 联合体名
{
//...
//...成员变量
};

union加空格后输入联合体名,随后大括号内写所有的成员变量,最后分号结束语句。

2)联合体变量创建

1,声明时创建:在声明一种联合体类型时就直接创建要用的变量,像这样:

2,声明后创建:在声明联合体之后再创建要用的变量,像这样:

变量若是在函数外创建,则为全局变量;若是在函数内创建,则为局部变量。

3)联合体内存使用

若想在某个联合体变量内存储数据,在赋值时需要精确到成员变量。

正确赋值方法:

此外,当对联合体较小的成员变量赋值时,不会销毁或初始化未涉及到内存区域。

证明:

s1.a为INT_MAX时,以十六进制打印s1.a结果为7FFFFFFF。

s1.b赋值后,再次打印四个字节,若高位的三个字节仍然是7FFFFF,则得证。

#include<stdio.h>
#include<limits.h>
union my_union
{
int a;
char b; };
union my_union s1;
int main()
{
s1.a =INT_MAX;
printf("%X\n", s1.a); s1.b = 0;
printf("%X\n", s1.a); return 0;
}

效果图:

联合体大小计算

1)计算规则

  • 联合体大小至少为最多成员变量的大小。

    原因也很简单,联合体的内存必须能容纳小其任一个成员变量。

  • 联合体的总大小必须是最大对其数的整数倍。

    原因和结构体一样,为了访问速度,为了增强移植性等。

2)例题

请计算s1,s2,s3各自的大小。

union
{
int a;
char b;
short arr1[5];
}s1;
union
{
int a;
char b;
int arr2[20];
}s2;
union
{
int a;
char b;
char c;
}s3;

答:

int main()
{
printf("%d\n", sizeof(s1));
printf("%d\n", sizeof(s2));
printf("%d\n", sizeof(s3));
return 0;
}

巧用联合体、判断大小端

请你用设计一个程序,利用联合体判断当前环境是大端还是小端。(禁止使用指针)

对于这样一个联合体s1来说:

union
{
int a;
char b;
}s1;

使用a时,会从低位向高位读取4个字节;

使用b时,会从低位向高位读取1个字节。

那么,只要我们令s1.a=1,然后再利用s1.b访问一下s1的低位的一个字节,看看是否为1即可。

若为1,则代表低位字节放在了低位,是小端。

若为0,则代表低位字节放在了高位,是大端。

打印结果是1,符合博主使用的环境。


感谢您的阅读与耐心~

C语言联合体(共用体)使用方法及大小计算的更多相关文章

  1. C语言:结构体和联合体(共用体)

    结构体:struct 1.结构体变量的首地址能够被其最宽基本类型成员的大小所整除. 2.结构体每个成员相对于结构体首地址的偏移量(offset)都是成员的整数倍. 3.结构体的总大小为结构体最宽基本类 ...

  2. (C语言)共用体union的使用方法举例

    曾经在学校学习C语言的时候一直搞不懂那个共用体union有什么用的.工作之后才发现它的一些妙用,现举比例如以下: 1. 为了方便看懂代码. 比方说想写一个3 * 3的矩阵,能够这样写: [ 注:以下用 ...

  3. C语言之共用体

    最近在复习C语言,特再次记录: 有时需要将几种不同类型的变量存放到同一段内存单元中.如一个int.float.char放在同一个地址开始的内存单元中.,也就是使用覆盖技术,几个变量相互覆盖,称之为共用 ...

  4. Go语言 6 结构体、方法和接口

    文章由作者马志国在博客园的原创,若转载请于明显处标记出处:http://www.cnblogs.com/mazg/ Go学习群:415660935 结构体(struct)是由一系列具有相同类型或不同类 ...

  5. (转)C语言union(联合体 共用体)

    一直以来,union都是个很少用到的东西,对于这些不常用的结构往往记不住.这次看书又看到了,还是学习一下吧.一般在Windows API的一些数据结构中才能看到这个union,其实并不复杂.本质上来说 ...

  6. Go语言之结构体与方法

    一.结构体 结构体是一系列属性的集合(类似于 Python 中的类) 1.结构体的定义与使用 // 定义 type Person struct { Name string Age int Sex st ...

  7. [C#.NET 拾遗补漏]14:使用结构体实现共用体

    在 C 和 C# 编程语言中,结构体(Struct)是值类型数据结构,它使得一个单一变量可以存储多种类型的相关数据.在 C 语言中还有一种和结构体非常类似的语法,叫共用体(Union),有时也被直译为 ...

  8. 嵌入式-C语言基础:联合体和共用体的概念

    有时候同一块内存空间存放类型不同,不同类型的变量共享一块空间. 结构体和共用体的区别: (1)结构体元素有各自单独空间,共用体元素共享空间,空间大小由最大类型确定. (2)结构体元素互不影响共用体赋值 ...

  9. 不可或缺 Windows Native (8) - C 语言: 结构体,共用体,枚举,类型定义符

    [源码下载] 不可或缺 Windows Native (8) - C 语言: 结构体,共用体,枚举,类型定义符 作者:webabcd 介绍不可或缺 Windows Native 之 C 语言 结构体 ...

  10. 全国计算机等级考试二级教程-C语言程序设计_第14章_结构体、共用体和用户定义类型

    函数的返回值是结构体类型 #define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<stdlib.h> struct ...

随机推荐

  1. RocketMQ消息短暂而又精彩的一生

    大家好,我是三友~~ 这篇文章我准备来聊一聊RocketMQ消息的一生. 不知你是否跟我一样,在使用RocketMQ的时候也有很多的疑惑: 消息是如何发送的,队列是如何选择的? 消息是如何存储的,是如 ...

  2. [WPF]鼠标移动到Button颜色改变效果设置

    代码 <Style x:Key="Button_Menu" TargetType="{x:Type Button}"> <Setter Pro ...

  3. 02-Tcl输出、赋值与替换

    2 Tcl输出.赋值与替换 2.1 puts Tcl的输出命令是puts,将字符串标准输出channelled.语法中两个问号之间的参数为可选参数. # 例1 puts hello # 输出 hell ...

  4. 基于 VScode 搭建 STM32 运行环境

    所需软件 vscode: 是我们的代码编辑器 STM32CubeMX: 是我们配置和初始化的软件 OpenOCD: 是开源片上调试器, 他下载完是一个压缩包, 需要配置环境 arm-none-eabi ...

  5. angular Ionic CLI项目开始

  6. 商城网站商品sku选择的js简易实现

    商城网站商品sku选择的js简易实现 <!DOCTYPE HTML> <html lang="en-US"> <head> <meta c ...

  7. 软工综合实践课设——员工招聘系统(参考BOSS直聘);Pyhton实现

    应用背景: 随着科学技术的发展,岗位数量越来越多,特别是每逢毕业季找工作的人数也很多,如果人们找工作或者企业招人靠纯手工的话,费时费力,仅仅是筛选简历和费劲,并且员工找工作投简历可能得需要克服时间和空 ...

  8. python学习day04

    1.基本数据类型之布尔值bool 1.用来判断事物的对错,是否可行,用于流程控制中 2.只有两种状态: True:对的.真的.可行的 False:错的.假的.不可行的 3.python中所有的数据都自 ...

  9. 【学习日志】@NotNull注解不生效问题

    后端API需要接受fe传过来的参数,就必然涉及到参数校验. Spring提供了使用注解进行非法判断的引用(需要主动引入),继承自 spring-boot-starter-parent <depe ...

  10. LeetCode_单周赛_329

    2544. 交替数字和 代码1 转成字符串,逐个判断 class Solution { public int alternateDigitSum(int n) { char[] s = (" ...