1.概念
- 在C中,不同数据类型的数据可以使用共同的存储区域,这种数据构造类型称为共用体,又称联合体。其形式与结构体相似。不同点在于使用内存的方式上
union 共用体名
{
成员表名;
};
例如:
union gy
{
int i;
char c;
float f;
};
此共用体由3个成员组成,这3个成员在内存中使用共同的存储空间。由于共用体中各成员数据类型不同,故共用体变量在存储时总是按其成员中数据长度最大的成员占用内存
#include <stdio.h>
union gy
{
char a;
short b;
int c;
};
int main(int argc, const char *argv[])
{
printf("%d %d %d\n", sizeof(char), sizeof(short), sizeof(int));
printf("%d\n", sizeof(union gy));
return 0;
}
hanqi@hanqi-PC:~/C/struct$ ./union1
1 2 4
4
2.大小端
- 大端模式,是指数据的高字节保存在内存的低地址中,而数据的低字节保存在内存的高地址中
- 小端模式,是指数据的高字节保存在内存的高地址中,而数据的低字节保存在内存的低地址中
#include <stdio.h>
union gy
{
char a;
short b;
int c;
};
int main(int argc, const char *argv[])
{
printf("%ld %ld %ld\n", sizeof(char), sizeof(short), sizeof(int));
printf("%ld\n", sizeof(union gy));
union gy g1;
char *p;
g1.a = 'A';
g1.b = 0;
g1.c = 0x12345678;
p = (char *)&g1;
for(int i = 0; i < sizeof(union gy); i++){
printf("%#x\n", *p);//打印出0x前缀
p++;
}
return 0;
}
hanqi@hanqi-PC:~/C/struct$ ./union2
1 2 4
4
0x78
0x56
0x34
0x12
此处0x12为数据0x12345678高位,而指针是从地址低位遍历到高位,故此处高位地址存储高位数据,故为小端模式
3.typedef(数据结构)
- 在C中允许使用typedef关键字定义新的数据类型
typedef <已有数据类型> <新的数据类型>
typedef int INTEGER;
INTEGER i;
等效于
int i;
#include <stdio.h>
union gy
{
char a;
short b;
int c;
};
int main(int argc, const char *argv[])
{
printf("%ld %ld %ld\n", sizeof(char), sizeof(short), sizeof(int));
printf("%ld\n", sizeof(union gy));
union gy g1;
char *p;
g1.a = 'A';
g1.b = 0;
g1.c = 0x12345678;
p = (char *)&g1;
for(int i = 0; i < sizeof(union gy); i++){
printf("%#x\n", *p);//打印出0x前缀
p++;
}
return 0;
}