C语言union(联合体、共用体)及应用

C语言union(联合体、共用体)及应用

在结构体(变量)中,结构的各成员顺序排列存储,每个成员都有自己独立的存储位置。联合(union)变量的所有成员共享同片存储区/内存。因此联合变量每个时刻里只能保存它的某一个成员的值。

联合变量也可以在定义时直接初始化,但这个初始化只能对第一个成员进行。例如下面的描述定义了一个联合变量,并进行了初始化。

1 uunion data
2 {
3     char n;
4     float f;
5 };
6 union data u1 = {3}; //只有u1.n被初始化

union的主要特征有:

union中可以定义多个成员,union的大小由最大的成员的大小决定;

union成员共享同一块大小的内存,一次只能使用其中的一个成员; 
对union某一个成员赋值,会覆盖其他成员的值(但前提是成员所占字节数相同,当成员所占字节数不同时只会覆盖相应字节上的值,比如对char成员赋值就不会把整个int成员覆盖掉,因为char只占一个字节,而int占四个字节);
union量的存放顺序是所有成员都从低地址开始存放的

因此,可以用联合(union)来判断CPU的大小端(印第安序):

 1 int checkCPU()
 2 {
 3     union w
 4     {
 5         int a;
 6         char b;
 7     }c;
 8
 9     c.a = 1;
10
11     return ( c.b == 1 );
12 }

同样的道理,在Linux中给出了更加精练的实现。如果宏ENDIANNESS=‘l‘表示系统为little endian, 为‘b’表示big endian。

1 static union
2 {
3     char c[4];
4     unsigned long l;
5 }endian_test = { {‘l‘,‘?‘,‘?‘,‘b‘} };
6
7 #define ENDIANNESS ( (char)endian_test.l )
时间: 2024-10-29 19:05:30

C语言union(联合体、共用体)及应用的相关文章

C语言:结构体和联合体(共用体)

结构体:struct 1.结构体变量的首地址能够被其最宽基本类型成员的大小所整除. 2.结构体每个成员相对于结构体首地址的偏移量(offset)都是成员的整数倍. 3.结构体的总大小为结构体最宽基本类型成员大小的整数倍. cpu的字长: 32位的cpu或64位的cpu 32位或64位指的是cpu的字长 字长实际上指得是cpu在访问内存时,一次可以读取的长度. 内存对齐(可以设置,一般是2的倍数,虽然浪费了空间,但是方便了cpu更好更快的取出数据): char  4个字节 int    4个字节

C语言Union

对于Union我用的比较少,最近一段时间大多使用Lua,所以复习一下Union Union是共用体,顾名思义,公用一块内存 一块内存不同的访问方式 // 1.数组的便捷访问 // 一块内存两种等价的访问方式 template <typename T> union Mat4x4 { struct{ T m00, m01, m10, m11; }; T m[2][2]; }; int main(int argc, const char * argv[]) { Mat4x4<float>

结构体、共用体和位运算

1.C语言结构体的定义和使用 在实际问题中,一组数据往往具有不同的数据类型:例如在学生信息登记表中,姓名为字符型,学号为整型或字符型,年龄为整型,性别为字符型,成绩为整型或实型.因为数据类型不同,显然不能用一个数组来存放. 在C语言中,可以使用结构体(Struct)来存放一组不同类型的数据.定义结构体的一般形式为: struct 结构体名{ 成员列表 }; 每个成员都是结构体的组成部分,有名字,也有数据类型,形式为: 类型说明符 成员名; 例如用结构体来表示学生信息: struct stu{ c

浅谈c++中结构体和共用体的区别

在c++中,结构体(struct)和共用体(union)是两种很相似的复合数据类型,都可以用来存储多种数据类型,但是两者还有很大的区别. 结构体(struct) 结构是用户自定义的类型,比数组更灵活,同一个结构可以存储多种类型的数据. 结构的创建包括两步,首先定义结构描述---描述并标记了能够存储在结构中的各种数据类型. struct  shoes { char name[20]; int size; double price; }; 下面就可以按描述创建结构变量. shoes sport; [

(C语言)共用体union的使用方法举例

曾经在学校学习C语言的时候一直搞不懂那个共用体union有什么用的.工作之后才发现它的一些妙用,现举比例如以下: 1. 为了方便看懂代码. 比方说想写一个3 * 3的矩阵,能够这样写: [ 注:以下用红色部分标记的地方是后来加入上去的,谢谢yrqing718的提醒!] struct  Matrix { union { struct { float  _f11, _f12, _f13, _f21, _f22, _f23, _f31, _f32, _f33; }; float  f[3][3]; }

C语言共用体union

union共用体说明: 当一个共用体被声明时, 编译程序自动地产生一个变量, 其长度为联合中最大的变量长度的整数倍. 比如union中有{int x; double x1; char name[10];}这个共用体的长度为10字节,因为name[10]是这个共用体中最大的一个变量 #include <stdio.h> struct A { int num; char name[20]; char job; union //共用体关键字union { int x; char zy[20]; }t

不可或缺 Windows Native (8) - C 语言: 结构体,共用体,枚举,类型定义符

[源码下载] 作者:webabcd 介绍不可或缺 Windows Native 之 C 语言 结构体 共用体 枚举 类型定义符 示例cStruct.h #ifndef _MYHEAD_STRUCT_ #define _MYHEAD_STRUCT_ #ifdef __cplusplus extern "C" #endif char *demo_cStruct(); #endif cStruct.c /* * 结构体,共用体,枚举,类型定义符 * * 注:结构体变量在做参数传递时,其内每个

C语言之共用体

1:共用体(union)类型的定义 union myunion { int a; char b; }; int main(void) { myunion u1; u1.a = 23; printf("u1.b = %d\n", u1.b);     //23 printf("&u1.a = %p \n",&(u1.a));  //&u1.a = 0xbfbe5c04 printf("&u1.b = %p \n",&

共用体(union)

在C语言中,当不同数据类型的数据共同占有使用一块内存空间时,这个数据构造类型叫做共用体,也叫联合体.共用体用的地方比较少,使用形式与结构体类似,但是内存使用方式不同. 1--- 定义 union 共用体类型名 { 成员表列: }变量名1:union 共用体类型名 变量名2: 2--- 成员共用同一个存储区域,共用体类型变量是以最后一次