【C语言学习】union关键字

union关键字与struct关键字的用法很相似,先看例子:

#include <stdio.h>

int main(void)
{
	/*struct结构体*/
	struct
	{
		int i;
		char a[4];
	}s;

	/*union结构体*/
	union
	{
	   int i;
	   char a[4];
	}u;

	printf("sizeof(int)=%d\n",sizeof(int));

	/*s结构体赋值*/
	s.a[0] = 0x00;
	s.a[1] = 0x01;
	s.a[2] = 0x00;
	s.a[3] = 0x00;
	printf("s.i=%d\n",s.i);

	/*u结构体赋值*/
	u.a[0] = 0x00;
	u.a[1] = 0x01;
	u.a[2] = 0x00;
	u.a[3] = 0x00;
	printf("u.i=%d\n",u.i);
}

打印结果:

sizeof(int)=4

s.i=-858993460

u.i=256

按照以上例子,s结构体所占用的内存结构为8个字节:

S结构体赋值后的内存结构为:

u结构所占用的内存结构为4个字节:

u结构体赋值后的内存结构为:

样是结构体,struct和union的差别就在于内存的分配。struct的内存分配是成员内存的总和,如s结构体一共占int+char[4]=4+4=8个字节。而union 只配置一个足够大的空间用来容纳最大长度的数据成员,也就是union最大占用内存的成员就是这个union结构体的最大内存。换句话说,这个union的内存是各个成员公用的,例如以上例子,u结构体的成员变量有int和char数组,长度分别为4,4。u占用的内存去成员变量的最大占用内存值,所以还是4个字节。对union 型的成员的存取都是相对于该联合体基地址的偏移量为0
处开始,当给u的char数组赋值的时候,就从u的字节低位(基地址)开始分配。赋值后,在打印u.i的时候就是从联合体u获取i的值,根据union的规则,内存是公共的,也是从该联合体基地址的偏移量为0 处开始获取4个字节。根据u赋值后的内存结构当整数来处理就相当于256了。而s.i是没有赋值的,只能获取随机数。

总结:union的好处就是节省了内存空间,不过还是得看场合使用。

注意:系统的存储模式会直接影响union结构体的取值,例如大端模式和小端模式。

时间: 2024-10-11 22:09:40

【C语言学习】union关键字的相关文章

C语言union关键字,union和struct区别

union 关键字的用法与struct 的用法非常类似. union 维护足够的空间来置放多个数据成员中的“一种”,而不是为每一个数据成员配置空间,在union 中所有的数据成员共用一个空间,同一时间只能储存其中一个数据成员,所有的数据成员具有相同的起始地址.例子如下: union StateMachine { char character; int number; char *str; double exp; }; 一个union 只配置一个足够大的空间以来容纳最大长度的数据成员,以上例而言,

Go语言学习笔记(二) [变量、类型、关键字]

日期:2014年7月19日 1.Go 在语法上有着类 C 的感觉.如果你希望将两个(或更多)语句放在一行书写,它们 必须用分号分隔.一般情况下,你不需要分号. 2.Go 同其他语言不同的地方在于变量的类型在变量名的后面.例如:不是,int a,而是 a int.当定义了一个变量,它默认赋值为其类型的 null 值.这意味着,在 var a int后,a 的 值为 0.而 var s string,意味着 s 被赋值为零长度字符串,也就是 "". 3.Go语言的变量声明和赋值 在Go中使

C语言学习入门 (一) 编译、链接、关键字、数据类型、printf函数

参考链接:http://blog.csdn.net/jjwwmlp456/article/details/41676225 编译文件:cc -c one.c two.c  生成.o目标文件 链接文件:cc one.o two.o     默认生成 a.out 执行文件 指定生成的可执行文件名   cc -o one one.o 连续编译.链接:cc one.c      cc -o one one.c    中间生成的.o文件会被删除,最后生成执行文件 cc one.c two.c   源文件超

C语言union关键字

union 维护足够的空间来置放多个数据成员中的“一种”,而不是为每一个数据成员配置空间,在union 中所有的数据成员共用一个空间,同一时间只能储存其中一个数据成员,所有的数据成员具有相同的起始地址.例子如下:union StateMachine{   char character;   int number;   char *str;   double exp;}; 一个union 只配置一个足够大的空间以来容纳最大长度的数据成员,以上例而言,最大长度是double 型态,所以StateMa

【转】朱兆祺教你如何攻破C语言学习、笔试与机试的难点(连载)

原文网址:http://bbs.elecfans.com/jishu_354666_1_1.html 再过1个月又是一年应届毕业生应聘的高峰期了,为了方便应届毕业生应聘,笔者将大学四年C语言知识及去年本人C语言笔试难点进行梳理,希望能对今年应届毕业生的应聘有所帮助. 2013年10月18日更新-->    攻破C语言这个帖子更新到这里,我不仅仅是为了补充大学学生遗漏的知识,我更重要的是希望通过我的经验,你们实际项目中的C语言写得漂亮,写出属于你的风格.“朱兆祺STM32手记”(http://bb

go语言学习(五)——面向对象编程

主要讲的是"类"和接口&和其他传统语言不一样的地方挺多的,断断续续看了好几天 下面是我的练习代码 // GoStudy0219 project main.go /* go语言学习--面向对象编程(1) go中类型的值语义和引用语义 结构体(类)的定义和初始化 */ package main import ( "fmt" ) func main() { //几种"类"的初始化 v1 := &character{"Tom&q

PHP语言学习之html5的学习,一周总结

通过这周的html5的学习我整理了一下一些东西和一些总结 写代码的时候也开头都要对齐这样开起来很舒服,这些都是用到缩进键搞定的,比如<html></html>在一块写,要前后对齐,这样容易发现错误,而且看起来比较清晰 写代码是还有英文和中文的标点符号的问题,这些都要是注意的,(这基本是我在学习的时候遇到的问题) 要掌握好重要的标签,这样能够更好的学习.... 开始学习html 5 什么是html5HTML是由W3C的维护的 HTML是大小写不敏感的,HTML与html是一样的 HT

C语言学习(二)——字符串和格式化输入输出

C语言学习(二)——字符串和格式化输入输出 1.char数组类型和空字符 C没有为字符串定义专门的变量类型,而是把它存储在char数组里.数组的最后一个位置显示字符\0.这个字符就是空字符,C用它来标记字符串的结束,其ASCII码的值为(或者等同于)0.C的字符串存储时通常以这个空字符结束,该字符的存在意味着数组的单元数必须至少比要存储的字符数多1.计算机可以自己处理大多数这些细节问题(例如,scanf( )会添加'\0'使得数组内容成为C字符串). 2.strlen( )函数与sizeof运算

Go语言学习笔记一(语法篇)

国庆节七天假期,这段时间刚好项目那边催的不是很紧,基本上每天都是白天重构一下项目代码,晚上自己学习.(大概是因为容总那边的人都去度假了把项目进度放慢了吧.这两天“彩虹”姐姐也来凑热闹,据说还是直接从澳门出发,然后漂洋过海到了咱们大广东,昨天还在顺德发了个大脾气.苦逼的咱们几个还是天天待在工作室发霉,因为害怕被彩虹姐姐带走,所以把工作室的门窗锁得紧紧的,然后把空调开到20多度,穿上外套,哈哈,这才叫个爽啊!).最近看到了一篇文章名曰<不要在一门技术上吊死> 深有感触,于是就开始着手学习久闻大名但