C语言联合体(共用体)使用方法及大小计算
作者的话
本文介绍联合体的定义、如何使用联合体,包括联合体的声明、联合体变量创建、联合体内存使用,以及联合体大小的计算,最后附上用联合体判断当前环境是大端还是小端的方法。
联合体的定义
联合体,又叫共用体,是由程序员自己设定的一种自定义数据类型。和结构体一样,联合体也拥有许多成员变量,不过其所有的成员变量占用空间的地址都相同,即所有成员使用同一份空间。
如何使用联合体
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语言联合体(共用体)使用方法及大小计算的更多相关文章
- C语言:结构体和联合体(共用体)
结构体:struct 1.结构体变量的首地址能够被其最宽基本类型成员的大小所整除. 2.结构体每个成员相对于结构体首地址的偏移量(offset)都是成员的整数倍. 3.结构体的总大小为结构体最宽基本类 ...
- (C语言)共用体union的使用方法举例
曾经在学校学习C语言的时候一直搞不懂那个共用体union有什么用的.工作之后才发现它的一些妙用,现举比例如以下: 1. 为了方便看懂代码. 比方说想写一个3 * 3的矩阵,能够这样写: [ 注:以下用 ...
- C语言之共用体
最近在复习C语言,特再次记录: 有时需要将几种不同类型的变量存放到同一段内存单元中.如一个int.float.char放在同一个地址开始的内存单元中.,也就是使用覆盖技术,几个变量相互覆盖,称之为共用 ...
- Go语言 6 结构体、方法和接口
文章由作者马志国在博客园的原创,若转载请于明显处标记出处:http://www.cnblogs.com/mazg/ Go学习群:415660935 结构体(struct)是由一系列具有相同类型或不同类 ...
- (转)C语言union(联合体 共用体)
一直以来,union都是个很少用到的东西,对于这些不常用的结构往往记不住.这次看书又看到了,还是学习一下吧.一般在Windows API的一些数据结构中才能看到这个union,其实并不复杂.本质上来说 ...
- Go语言之结构体与方法
一.结构体 结构体是一系列属性的集合(类似于 Python 中的类) 1.结构体的定义与使用 // 定义 type Person struct { Name string Age int Sex st ...
- [C#.NET 拾遗补漏]14:使用结构体实现共用体
在 C 和 C# 编程语言中,结构体(Struct)是值类型数据结构,它使得一个单一变量可以存储多种类型的相关数据.在 C 语言中还有一种和结构体非常类似的语法,叫共用体(Union),有时也被直译为 ...
- 嵌入式-C语言基础:联合体和共用体的概念
有时候同一块内存空间存放类型不同,不同类型的变量共享一块空间. 结构体和共用体的区别: (1)结构体元素有各自单独空间,共用体元素共享空间,空间大小由最大类型确定. (2)结构体元素互不影响共用体赋值 ...
- 不可或缺 Windows Native (8) - C 语言: 结构体,共用体,枚举,类型定义符
[源码下载] 不可或缺 Windows Native (8) - C 语言: 结构体,共用体,枚举,类型定义符 作者:webabcd 介绍不可或缺 Windows Native 之 C 语言 结构体 ...
- 全国计算机等级考试二级教程-C语言程序设计_第14章_结构体、共用体和用户定义类型
函数的返回值是结构体类型 #define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<stdlib.h> struct ...
随机推荐
- 第三方模块的下载与使用 requests模块 openpyxl模块
今日内容 第三方模块下载操作 第三方模块: 别人写的魔魁啊 一般情况下都很强大 python中模块很多 如果想使用第三方模块 第一次必须先下载 后面就可以反复使用 =内置模块 下载第三方模块的方式: ...
- Goby安装与使用
前言 Goby是一款基于网络空间测绘技术的新一代网络安全工具,它通过给目标网络建立完整的资产知识库,进行网络安全事件应急与漏洞应急. Goby可提供最全面的资产识别,目前预置了超过10万种规则识别引擎 ...
- Java基础1-1-3—java基础语法(条件控制语句)
3. 条件控制语句 3.1 流程控制语句-顺序结构 流程控制语句:通过一些语句,来控制程序的[执行流程] 流程控制语句分类: 顺序结构 分支结构(if,switch) 循环结构(for,while,d ...
- 方法引用_通过类名引用静态成员方法-方法引用_通过super引用父类的成员方法
方法引用_通过类名引用静态成员方法 由于在java.lang .Nath类中已经存在了静态方法 abs,所以当我们需要通过Lambda来调用该方法时,有两种写法.首先是函数式接口∶ 第一种写法是使用L ...
- Object类的toString方法-Object类的equas方法
Object类的toString方法 Object 是类层次结构的根(最顶层)类.每个类都是用 Object 作为超(父)类. 所有对象(包括数组) 都实现这个类的方法 Person类默认继承了Obj ...
- Node.js学习笔记----day04之学生信息管理系统
认真学习,认真记录,每天都要有进步呀!!! 加油叭!!! 一.起步 项目结构 安装需要的包 初始化显示index.html index.html var express = require('expr ...
- Springboot整合AOP和注解,实现丰富的切面功能
简介 我们在文章<Spring AOP与AspectJ的对比及应用>介绍了AOP的使用,这篇文章讲解一下AOP与注解的整合,通过注解来使用AOP,会非常方便.为了简便,我们还是来实现一个计 ...
- springBoot简单记录日志
记录日志的几种方法 springboot项目内置日志框架 在配置文件中添加以下配置: logging: file: name: "./log/xxx.log" pattern: f ...
- 《Terraform 101 从入门到实践》 Functions函数
<Terraform 101 从入门到实践>这本小册在南瓜慢说官方网站和GitHub两个地方同步更新,书中的示例代码也是放在GitHub上,方便大家参考查看. Terraform的函数 T ...
- 周末折腾了两天,踩了无数个坑,终于把win7装成了centos7
上周五的时候,突发奇想,想把自己的Thinkpad E430C的操作系统装成linux. 熟悉电脑的都知道Thinkpad E430C很古老了,现在算来从2012年买来,到现在已经经历了10个年头了. ...