如何把自己做的网站放到网上,做网站套路,查看网站是用什么做的,网架生产公司联合 引言联合的声明联合的声明typedef命名联合 设置联合的值C89#xff08;标准#xff09;方式使用.操作符进行指定初始化 联合的内存布局联合的使用场景节省内存资源实际应用案例分析 总结 引言
在学习C语言基础时#xff0c;联合和结构体是两个经常被拿来比较的概念。虽… 联合 引言联合的声明联合的声明typedef命名联合 设置联合的值C89标准方式使用.操作符进行指定初始化 联合的内存布局联合的使用场景节省内存资源实际应用案例分析 总结 引言
在学习C语言基础时联合和结构体是两个经常被拿来比较的概念。虽然它们在某些方面相似比如它们都能存储多个成员、在声明、初始化、访问等方面都有很多共同点。
所以如果想学习联合结构体是不得不学习的一部分请查看我的博客结构体。
联合相对于结构体而言使用了一种特殊的内存使用方法。联合允许在相同的内存位置存储不同的数据类型当然这种特性只有在特定场景下非常有用尤其是在需要节省内存或者处理多种数据类型但不需要同时使用它们的场景中。
联合的声明
联合的声明
联合的声明与结构体类似声明联合的语法代码如下
union Myunion{int intValue;float floatValue;char *string;
};这里的union为声明联合的关键字Myunion是联合的变量类型。
typedef命名联合
这一点也和结构体的命名非常类似。
typedef union{int intValue;float floatValue;char *string;
}Myunion;这一串的代码与上面的代码的区别是使用了typedef将结构体起了一个新的名字这样在之后的编码过程中就不需要使用union来定义联合。
设置联合的值
C89标准方式
如果联合想保存第一个字段的值只要用花括号把值括起来就可以把值 赋给联合中的第一个字段。
typedef union {short count;float weight;float volume;
}quantity;quantity q{4}//相当于将count赋值为4使用.操作符进行指定初始化
.操作符也是我们的老朋友了只不过这次我们需要指定将某一个字段初始化。
typedef union {short count;float weight;float volume;
}quantity;quantity q{.weight1.5}//相当于将weight赋值为1.5
//或者用下面的代码
quantity q;//先进行声明。
q.volume3.7//对volume赋值为3.7。
联合的内存布局
在上述示例中不管是intValue、floatValue还是string它们都占据了相同的内存位置。这是联合的关键特点同一时间只能有效地存储一个成员的值因为所有成员共享内存。
typedef union {short count;float weight;float volume;
}quantity;这里的三个变量count、weight、volume在同一时间只能有效地存储一个的值如果强行进行定义就会丢失数据。
为了能够表达所有的变量short占2个字节、float占4个字节。以占最大内存的float为标准联合占内存大小为4个字节。
在这里针对内存布局我们可以使用下面的代码进行说明
union MyUnion data;
data.intValue 3;//
printf(%d\n, data.intValue);
data.floatValue 4.5;
printf(%d\n, data.floatValue);
printf(%d\n, data.intValue);// 如果执行这行代码此时尝试访问data.intValue将得到一个未定义的结果因为最后存储的是floatValue。联合的使用场景
节省内存资源
在系统中内存资源是有限的联合在一定程度上可以有效减少内存的占用。联合通过共享内存不同类型的数据可以被折叠存储减少了各个变量对内存的占用。
实际应用案例分析
在实际应用中联合的使用非常广泛。例如在网络通信中处理不同类型的消息包或者在图形用户界面中处理不同类型的事件数据。
我们以一个现实的例子来说明这个问题比如描述苹果我们可以从个数、体积、质量等方面进行描述我们只需要用一个量就可以描述苹果这个事物
union quantity {short count;float weight;float volume;
};总结
在系统中内存空间资源是有限的。由于联合的特殊内存使用方式赋予了它极为高效的内存使用效率这造就了它在一些特殊情形的极为优秀的应用。可是“成也萧何败也萧何”在联合很大程度上节约内存的同时联合在同一时间点只能表达一个变量这导致了它的使用情形比较狭窄如果没有合理利用就会有数据丢失的风险。