目录
1、联合体
1.1、联合体简介
联合体、共用体union,联合体的声明和结构体类似,联合体(union)和结构体(struct)同样可以包含多种数据类型和变量,但与结构体的功能却不同,联合体中所有成员共用同一块内存,系统为联合体中最大的成员分配内存,结构体是每一个成员都要分配内存,结构体需要注意的是内存对齐的问题。
总结:
1.结构体成员变量空间是独立的
2.共用体成员变量空间是共享的
int main(void)
{
union data
{
int a;
char b;
float c;
double d;//联合体为最大成员的开辟空间,其他成员共用此空间
};
struct stu
{
int num;
char name;
int age;// struct 为所有成员开辟空间
};
union data x;
struct stu Li;
printf("联合体data占用内存%d\n",sizeof(x));
printf("结构体stu占有内存%d\n",sizeof(Li));
return 0;
}
联合体data占用内存8
结构体stu占有内存12
联合体union分配的同一块内存,被翻译成不同类型的数据,且翻译的类型取决于定义的数据类型。简单来说,就是编译器为联合分配了空间,空间中存储什么类型的数由操作者定义。
#include <stdio.h>
int main(void)
{
union fi
{
int a;
char b;
float c;
}fi;
fi.a=10;
printf("a=%d\n",fi.a);
fi.b='w';
printf("b=%c\n",fi.b);
fi.c=3.1415;
printf("c=%lf\n",fi.c);
return 0;
}
a=10
b=w
c=3.141500
1.2、联合体的优缺点
联合体(union)中是各变量是“互斥”的——优点是内存使用更为精细灵活,也节省了内存空间。
共用体使用了内存覆盖技术,同一时刻只能保存一个成员的值,如果对新的成员赋值,就会把原来成员的值覆盖掉, 由于使用共用体的时候,必须记住当前存放在联合共用体变量中的是哪个成员,有很多不便。
共用体可以有很多的访问内存的手段,使用起来非常灵活,但是不同的访问之间没有互相进行屏蔽,这有时候会导致逻辑上的错误,比如成员占用的地址不一样多时,访问可能会导致乱码的情况。
1.3、联合体的应用
union的使用场合,是各数据类型各变量占用空间差不多并且对各变量同时使用要求不高的场合。
如何判断一个平台为内存大端?内存小端?
#include <stdio.h>
union s {
char a;
int b;
};
int main(int argc, const char *argv[])
{
union s s1;
s1.b = 1;
if (s1.a)
{
printf("小端!\n");
}
else
{
printf("大端!\n");
}
return 0;
}
#include<stdio.h>
union var{
char c[4];
int i;
};
int main(){
union var data;
data.c[0] = 0x04;//因为是char类型,数字不要太大,算算ascii的范围~
data.c[1] = 0x03;//写成16进制为了方便直接打印内存中的值对比
data.c[2] = 0x02;
data.c[3] = 0x11;
//数组中下标低的,地址也低,按地址从低到高,内存内容依次为:04,03,02,11。总共四字节!
//而把四个字节作为一个整体(不分类型,直接打印十六进制),应该从内存高地址到低地址看,0x11020304,低位04放在低地址上。
printf("%x\n",data.i);
}
内存大小端:
1.内存低地址存放低数