admin管理员组文章数量:1794759
小代老师带你深入理解联合体
1联合体
学习联合体之前让我们对比下 结构体,枚举,联合体的关键字
结构体:struct 枚举:enum 联合体:union
1.1联合体类型的声明
像结构体⼀样,联合体也是由⼀个或者多个成员构成,这些成员可以不同的类型。 但是编译器只为最⼤的成员分配⾜够的内存空间。联合体的特点是所有成员共⽤同⼀块内存空间。所 以联合体也叫:共⽤体。 给联合体其中⼀个成员赋值,其他成员的值也跟着变化。
为什么是输出8,4呢?
1.2 联合体的特点
联合的成员是共⽤同⼀块内存空间的,这样⼀个联合变量的⼤⼩,⾄少是最⼤成员的⼤⼩(因为联合 ⾄少得有能⼒保存最⼤的那个成员)。 我们再打印下他们的地址
代码1输出的三个地址⼀模⼀样,代码2的输出,我们发现将i的第4个字节的内容修改为55了。 我们仔细分析就可以画出,un的内存布局图
1.3 相同成员的结构体和联合体对⽐
我们再对⽐⼀下相同成员的结构体和联合体的内存布局情况。
代码语言:javascript代码运行次数:0运行复制struct str
{
char name;
int n;
};
union un
{
char name;
int n;
};
union un n1 = { 0 };
struct str n2={0};
1.4 联合体⼤⼩的计算
• 联合的⼤⼩⾄少是最⼤成员的⼤⼩。 • 当最⼤成员大小不是最⼤对⻬数的整数倍的时候,就要对⻬到最⼤对⻬数的整数倍
代码语言:javascript代码运行次数:0运行复制#include <stdio.h>
union Un1
{
char c[5]; //5 1 8 1
int i;// 4 8 4
};
union Un2
{
short c[7]; // 2 8 2
int i; // 4 8 4
};
int main()
{
//下⾯输出的结果是什么?
printf("%d\n", sizeof(union Un1));
printf("%d\n", sizeof(union Un2));
return 0;
}
使⽤联合体是可以节省空间的,举例: ⽐如,我们要搞⼀个活动,要上线⼀个礼品兑换单,礼品兑换单中有三种商品:图书、杯⼦、衬衫。 每⼀种商品都有:库存量、价格、商品类型和商品类型相关的其他信息。 图书:书名、作者、⻚数 杯⼦:设计 衬衫:设计、可选颜⾊、可选尺⼨ 那我们不耐⼼思考,直接写出⼀下结构:
代码语言:javascript代码运行次数:0运行复制#include<stdio.h>
int main()
{
struct gift_list
{
//公共属性
int stock_member;
double price;
int item_type;
//特殊属性
char title[20];
char author[20];
int num_pages;
char design[30];
int colors;
int sizes;
};
return 0;
}
上述的结构其实设计的很简单,⽤起来也⽅便,但是结构的设计中包含了所有礼品的各种属性,这样 使得结构体的⼤⼩就会偏⼤,⽐较浪费内存。因为对于礼品兑换单中的商品来说,只有部分属性信息 是常⽤的。⽐如: 商品是图书,就不需要design、colors、sizes。 所以我们就可以把公共属性单独写出来,剩余属于各种商品本⾝的属性使⽤联合体起来,这样就可以 介绍所需的内存空间,⼀定程度上节省了内存。
代码语言:javascript代码运行次数:0运行复制struct gift_list
{
//公共属性
int stock_member;
double price;
int item_type;
union s1
{
char title[20];
char author[20];
int num_pages;
};book
union s2
{
char design[30];
int colors;
int sizes;
};shirt
union s3
{
char design[30];
};mug
//特殊属性
char title[20];
char author[20];
int num_pages;
char design[30];
int colors;
int sizes;
};
1.5 联合的⼀个练习
写⼀个程序,判断当前机器是⼤端?还是⼩端?
代码语言:javascript代码运行次数:0运行复制#include<stdio.h>
int main()
{
union s1
{
char a;
int b;
}n1;
n1.b= 1;
if (n1.a == 1)
{
printf("小端");
}
else
printf("大端");
return 0;
}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。 原始发表:2024-06-09,如有侵权请联系 cloudcommunity@tencent 删除charint布局内存设计本文标签: 小代老师带你深入理解联合体
版权声明:本文标题:小代老师带你深入理解联合体 内容由林淑君副主任自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://www.xiehuijuan.com/baike/1754748669a1705924.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论