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 ...
随机推荐
- [编程基础] Python格式化字符串常量f-string总结
Python格式化字符串常量f-string总结 本文主要总结在Python中如何使用格式化字符串常量f-string(Formatted string literals).在 Python 程序中, ...
- Hadoop详解(10) - Hadoop HA高可用
Hadoop详解(10) - Hadoop HA高可用 HA概述 HA(High Availablity),即高可用(7*24小时不中断服务). 实现高可用最关键的策略是消除单点故障.HA严格来说应该 ...
- Redis哨兵集群搭建-Docker-Compose
title: Redis哨兵集群搭建(Docker-Compose) date: 2022-09-27 17:00:56 tags: - Redis 代码地址:https://github.com/l ...
- [cocos2d-x]TextureCache和spriteFramecache
SpriteFrameCache 主要服务于多张碎图合并出来的纹理图片.这种纹理在一张大图中包含了多张小图,直接通过TextureCache引用会有诸多不便,因而衍生出来精灵框帧的处理方式,即把截取好 ...
- Strapi入门记--01创建项目,账户,测试表,测试接口
Strapi 是什么 中文文档地址 Strapi 是一个开源的无头 CMS,开发人员可以自由选择他们喜欢的工具和框架,并允许编辑使用他们的应用程序的管理面板来管理和分发他们的内容.基于一个插件系统,S ...
- 使用json数据动态创建表格2(多次绘制第一次简化 var tr=tbody.insertRow();)
<!DOCTYPE HTML> <html> <head> <title>动态创建表格</title> <meta charset=& ...
- Angular在用户登录后设置授权请求头headers.append('Authorization', 'token');
方案1. 使用Angular http import {Injectable} from '@angular/core'; import {Http, Headers} from '@angular ...
- freeswitch号码黑名单
概述 freeswitch是一款简单好用的的VOIP开源软交换平台. 在客户的呼叫过程中,会遇到一些异常的号码,包括高投诉风险号码.敏感号码.特殊号码等. 在客户呼叫流程中,需要针对这些异常号码做呼叫 ...
- C#零基础小白快速入门
前言 本文写给想学C#的朋友,目的是以尽快的速度入门 C#好学吗? 对于这个问题,我以前的回答是:好学!但仔细想想,不是这么回事,对于新手来说,C#没有那么好学. 反而学Java还要容易一些,学Jav ...
- Windows离线安装.net Framework3.5
写在前面 本文主要介绍在Windows离线情况下安装.NETFramework3.5运行环境 使用场景 在日常开发C#程序中,经常会遇到开发过程中无任何问题,但是安装到目标电脑是会无法打开的,如下图 ...