结构体struct和联合体union(联合)有什么区别呢?
2022-07-03 20
一、结构体struct
各成员各自拥有自己的内存,各自使用互不干涉,同时存在的,遵循内存对齐原则。一个struct变量的总长度等于所有成员的长度之和。
二、联合体union
各成员共用一块内存空间,并且同时只有一个成员可以得到这块内存的使用权(对该内存的读写),各变量共用一个内存首地址。因而,联合体比结构体更节约内存。一个union变量的总长度至少能容纳最大的成员变量,而且要满足是所有成员变量类型大小的整数倍。不允许对联合体变量名U2直接赋值或其他操作。
代码1:对比struct和union占用内存大小
[code]
#include<stdio.h>
//结构体
struct u //u表示结构体类型名
{
char a; //a表示结构体成员名
int b;
short c;
}U1;
//U1表示结构体变量名
//访问该结构体内部成员时可以采用U1.a=1;其中"点"表示结构体成员运算符
//联合体
union u1 //u1表示联合体类型名
{
char a; //a表示联合体成员名
int b;
short c;
}U2;
//U2表示联合体变量名
//访问该联合体内部成员时可以采用U2.a=1;其中"点"表示联合体成员运算符
//主函数
int main(){
printf("%dn",sizeof(U1));
printf("%dn",sizeof(U2));
return 0;
}
/*程序运行结果是:
12
4*/
[/code]
所有成员共用一块存储空间,在操作不同的成员时,编译器根据不同的成员类型,按照不同的方式取值。
#include<stdio.h>
//联合体
union u1
{
char a;
int b;
short c;
}U2;
//主函数
int main(){
U2.a=a;
printf("%c%cn",U2.b,U2.c);//输出aa
U2.a=b;
printf("%c%cn",U2.b,U2.c);//输出bb
U2.b=0x4241;
printf("%c%cn",U2.a,U2.c);//输出AA
return 0;
}
代码3:union大小计算
union大小计算准则:1、至少要容纳最大的成员变量 2、必须是所有成员变量类型大小的整数倍
代码中U3至少容纳最大e[5]=20字节,同时变量类型最大值是整数倍,即使double(字节数是8)的整数倍,因而sizeof(U3)=24。
#include<stdio.h>
//联合体
union u2
{
char a;
int b;
short c;
double d;
int e[5];
}U3;
//主函数
int main(){
printf("%dn",sizeof(U3));//输出24
return 0;
}
代码4:union大小端模式
#include<stdio.h>
//联合体
union u3
{
char c[4];
int i;
}U4;
//主函数
int main(){
U4.C[0]=0X04;
U4.C[1]=0X03;
U4.C[2]=0X02;
U4.C[3]=0X11;
printf("%xn",U4.i);//输出为11020304 小端
return 0;
}
代码5:struct字节对齐
U5中a四个字节,后面b和c加起来3个字节,正好补1个字节对齐;U6中b1个字节,要和后面的a对齐,需要补3个字节对齐,c也要补1个字节对齐,因而最终U6为12个字节。另外,要想改变这种默认对齐设置,可以用
#pragma pack (2) /*指定按2字节对齐*/
#pragma pack () /*取消指定对齐,恢复缺省对齐*/
#include<stdio.h>
//联合体
struct u4
{
int a;
char b;
short c;
}U5;
struct u5
{
char b;
int a;
short c;
}U6;
//主函数
int main(){
printf("%dn",sizeof(U5));
printf("%dn",sizeof(U6));
return 0;
}
//输出为
//8
//12结构体里定义的各种变量都有自己独立的内存空间,而联合体中定义的变量公用一块内存结构体:a. 结构体中的每个成员都有自己独立的地址,它们是同时存在的b. sizeof(struct)是内存对齐后所有成员长度的总和联合体:a. 联合体中的所有成员占用同一段内存,它们不能同时存在;b. sizeof(union)是内存对齐后最长数据成员的长度不知道是否已经了解了两者的区别,看来是在学习编程,如果还有什么不了解的,你可以看黑马程序员视频库,有视频,也有社区讨论,比自己瞎看好多了!很高兴能为你提供帮助结构体:a. 结构体中的每个成员都有自己独立的地址,它们是同时存在的b. sizeof(struct)是内存对齐后所有成员长度的总和联合体:a. 联合体中的所有成员占用同一段内存,它们不能同时存在;b. sizeof(union)是内存对齐后最长数据成员的长度不知道是否已经了解了两者的区别,看来是在学习编程,如果还有什么不了解的,你可以看黑马程序员视频库,有视频,也有社区讨论,比自己瞎看好多了!能采纳我的建议是我的荣幸,谢谢,祝你生活愉快!结构体就懒得说了,他的每个成员都有属于自己的存储空间。
联合体,他的每个成员共享同一块空间,空间具体有多大,全取决于尺寸最大最粗最硬的那位。
联合体举例。
typedef union
{
unsigned char i;
unsigned int x
}uniondef;
你会发现在实际物理存储空间里,x占据两个房间,i也占据一个房间,i占据的房间属于x,而且i占据房间的地址总是低地址(会不会是高地址?也是可以的,不过一般默认cpu采取大端模式,具体请自行度娘
我是从部分mcu的角度说明的,这里int才取16位。
各成员各自拥有自己的内存,各自使用互不干涉,同时存在的,遵循内存对齐原则。一个struct变量的总长度等于所有成员的长度之和。
二、联合体union
各成员共用一块内存空间,并且同时只有一个成员可以得到这块内存的使用权(对该内存的读写),各变量共用一个内存首地址。因而,联合体比结构体更节约内存。一个union变量的总长度至少能容纳最大的成员变量,而且要满足是所有成员变量类型大小的整数倍。不允许对联合体变量名U2直接赋值或其他操作。
代码1:对比struct和union占用内存大小
[code]
#include<stdio.h>
//结构体
struct u //u表示结构体类型名
{
char a; //a表示结构体成员名
int b;
short c;
}U1;
//U1表示结构体变量名
//访问该结构体内部成员时可以采用U1.a=1;其中"点"表示结构体成员运算符
//联合体
union u1 //u1表示联合体类型名
{
char a; //a表示联合体成员名
int b;
short c;
}U2;
//U2表示联合体变量名
//访问该联合体内部成员时可以采用U2.a=1;其中"点"表示联合体成员运算符
//主函数
int main(){
printf("%dn",sizeof(U1));
printf("%dn",sizeof(U2));
return 0;
}
/*程序运行结果是:
12
4*/
[/code]
所有成员共用一块存储空间,在操作不同的成员时,编译器根据不同的成员类型,按照不同的方式取值。
#include<stdio.h>
//联合体
union u1
{
char a;
int b;
short c;
}U2;
//主函数
int main(){
U2.a=a;
printf("%c%cn",U2.b,U2.c);//输出aa
U2.a=b;
printf("%c%cn",U2.b,U2.c);//输出bb
U2.b=0x4241;
printf("%c%cn",U2.a,U2.c);//输出AA
return 0;
}
代码3:union大小计算
union大小计算准则:1、至少要容纳最大的成员变量 2、必须是所有成员变量类型大小的整数倍
代码中U3至少容纳最大e[5]=20字节,同时变量类型最大值是整数倍,即使double(字节数是8)的整数倍,因而sizeof(U3)=24。
#include<stdio.h>
//联合体
union u2
{
char a;
int b;
short c;
double d;
int e[5];
}U3;
//主函数
int main(){
printf("%dn",sizeof(U3));//输出24
return 0;
}
代码4:union大小端模式
#include<stdio.h>
//联合体
union u3
{
char c[4];
int i;
}U4;
//主函数
int main(){
U4.C[0]=0X04;
U4.C[1]=0X03;
U4.C[2]=0X02;
U4.C[3]=0X11;
printf("%xn",U4.i);//输出为11020304 小端
return 0;
}
代码5:struct字节对齐
U5中a四个字节,后面b和c加起来3个字节,正好补1个字节对齐;U6中b1个字节,要和后面的a对齐,需要补3个字节对齐,c也要补1个字节对齐,因而最终U6为12个字节。另外,要想改变这种默认对齐设置,可以用
#pragma pack (2) /*指定按2字节对齐*/
#pragma pack () /*取消指定对齐,恢复缺省对齐*/
#include<stdio.h>
//联合体
struct u4
{
int a;
char b;
short c;
}U5;
struct u5
{
char b;
int a;
short c;
}U6;
//主函数
int main(){
printf("%dn",sizeof(U5));
printf("%dn",sizeof(U6));
return 0;
}
//输出为
//8
//12结构体里定义的各种变量都有自己独立的内存空间,而联合体中定义的变量公用一块内存结构体:a. 结构体中的每个成员都有自己独立的地址,它们是同时存在的b. sizeof(struct)是内存对齐后所有成员长度的总和联合体:a. 联合体中的所有成员占用同一段内存,它们不能同时存在;b. sizeof(union)是内存对齐后最长数据成员的长度不知道是否已经了解了两者的区别,看来是在学习编程,如果还有什么不了解的,你可以看黑马程序员视频库,有视频,也有社区讨论,比自己瞎看好多了!很高兴能为你提供帮助结构体:a. 结构体中的每个成员都有自己独立的地址,它们是同时存在的b. sizeof(struct)是内存对齐后所有成员长度的总和联合体:a. 联合体中的所有成员占用同一段内存,它们不能同时存在;b. sizeof(union)是内存对齐后最长数据成员的长度不知道是否已经了解了两者的区别,看来是在学习编程,如果还有什么不了解的,你可以看黑马程序员视频库,有视频,也有社区讨论,比自己瞎看好多了!能采纳我的建议是我的荣幸,谢谢,祝你生活愉快!结构体就懒得说了,他的每个成员都有属于自己的存储空间。
联合体,他的每个成员共享同一块空间,空间具体有多大,全取决于尺寸最大最粗最硬的那位。
联合体举例。
typedef union
{
unsigned char i;
unsigned int x
}uniondef;
你会发现在实际物理存储空间里,x占据两个房间,i也占据一个房间,i占据的房间属于x,而且i占据房间的地址总是低地址(会不会是高地址?也是可以的,不过一般默认cpu采取大端模式,具体请自行度娘
我是从部分mcu的角度说明的,这里int才取16位。
相关文章
- 抖音那首很火的 I wanna huhuhu but a brokenheart是什么歌?
- 时光兜兜转转,我们不见不散,是哪首歌的歌词?
- 索尼A900怎么调动每一个对焦点?
- iPad能不能使用网银啊?
- 苹果f开头的是什么机?
- 小米 mi note lte是什么系列
- supreme打底衫什么颜色好看
- 印度电影almaxkanqiray 汉语名字
- 为什么@Resource出错
- 24v交流电源为什么无正负极只有24vAC和24vGND之分?
- 美国这个女的叫什么
- 联想t61笔记本刻录光盘驱动哪里下载
- C#中Convert和BitConverter类有什么区别
- 关于生物学上表皮的定义 出处
- gts250显卡好还是9600gt好?
- JFinal分页只能这样写吗
- iphone屏幕颜色偏黄怎么调?
- phantom.js 保存图片
- adidas nmdr1是什么鞋
- 谁知道AZ6130光刻胶那家公司有卖的,最好发一份关于AZ6130的英文说明书,感谢
- 本周热门
-
- tsf物语漫画全集无修
- h版58部大片 迅雷下载
- 佐佐木明希跟老公上司偷情 中途上司打电话给他老公 后边被侦探发现是什么作品?
- ofje104在线观看
- 雷神加速器连接不上是什么原因?
- 法国人的作息时间
- 用麻将可以摆出什么美丽的图案图片
- "Helix Studios - Spank This - Skyelr Bleu, Roxy Red & Zack Mason.m4v"高清完整版下载,感谢哈
- 群星怎么创建星域
- 纽仕兰奶粉事件曝光是个怎么回事
- 景德镇六八宝麻将图片
- 纲手对鸣人的惩罚
- com.lovelycat猫咪下载
- 有人会写马来文作文吗?题目是Hobi saya。大概350字。急用....2011年1月9日之前一定要用到...谢谢
- 一男一女在交肛的图
- 动漫女孩痛苦被吸奶
- 魔界之龙珠武功排名
- shutdown -s -t都是什么意思?
- 白青树宁连城婚前番外
- 《大太监》最新txt全集下载
- gta5线上模式茉德任务第一个人位置在哪?
- xshell设置默认输入法
- Genesis汉化](C79)(同人志)[TIES (タケイオーキ)] ず~っと!FireSisters★ (化物语)
- 喂奶门事件完整版
- 英文wontfix的中文什么意思
- 三国杀小乔本子资源
- off road是什么意思
- 天帝攻x魔尊受,是生子的
- 斗罗大陆之舞奴 2
- 为什么女生会操出水来