结构体和共用体在概念与使用上有什么不同?
2个回答
展开全部
简单的说:
结构体中每一个成员都有自己的内存空间。因此,结构体总大小一般情况下等于各成员大小之和(先不考虑内存对齐)。
共用体又叫联合体,每一个成员都共享内存空间。因此,共用体大小等于成员中最大的那个大小。
结构体我就不说了,它用处很广,最常见的是用它保存一个记录。例如,学生管理程序中,一个学生的信息。
共用体,我看见很少人会用,就不得不说说了,其实,共用体有很多妙用,用好了,会带来意想不到的效果。
如果光用共用体,那么实用性会减少很多,通常和结构体一起使用。
如下题目:
输入一个long,查看它的高位数和低位数。
一般人可能会去移位,但是,如果是用结构体共用体,那么这题根本就是小儿科。 完全可以赋值,输出就OK了。
解决这题可以设计这样的结构。
union uq1 {
long value; /*这就是输入的那个32位数*/
struct {
short lowbit; /*这是低位*/
short highbit; /*这是高位*/
} bit;
};
整个共用体还是4字节没有改变. 解决那题,就象这样:
uq1 u;
long v;
v=0x00FF00FF; /*就先假设输入的数是这个*/
u.value=v;
printf("high=%d,low=%d\n",u.bit.highbit,u.bit.lowbit);
这题的结果应该是:
high=255,low=255
怎么样这就把移位操作避免了..
结构体中每一个成员都有自己的内存空间。因此,结构体总大小一般情况下等于各成员大小之和(先不考虑内存对齐)。
共用体又叫联合体,每一个成员都共享内存空间。因此,共用体大小等于成员中最大的那个大小。
结构体我就不说了,它用处很广,最常见的是用它保存一个记录。例如,学生管理程序中,一个学生的信息。
共用体,我看见很少人会用,就不得不说说了,其实,共用体有很多妙用,用好了,会带来意想不到的效果。
如果光用共用体,那么实用性会减少很多,通常和结构体一起使用。
如下题目:
输入一个long,查看它的高位数和低位数。
一般人可能会去移位,但是,如果是用结构体共用体,那么这题根本就是小儿科。 完全可以赋值,输出就OK了。
解决这题可以设计这样的结构。
union uq1 {
long value; /*这就是输入的那个32位数*/
struct {
short lowbit; /*这是低位*/
short highbit; /*这是高位*/
} bit;
};
整个共用体还是4字节没有改变. 解决那题,就象这样:
uq1 u;
long v;
v=0x00FF00FF; /*就先假设输入的数是这个*/
u.value=v;
printf("high=%d,low=%d\n",u.bit.highbit,u.bit.lowbit);
这题的结果应该是:
high=255,low=255
怎么样这就把移位操作避免了..
展开全部
概念和功能很相似
只是共同体占用的空间要比结构体小一些 这与他们的原理有关
结构体占用的内存空间,是其元素,占空间的总和,而共用体是,元素中占用空间最大的元素的空间!所以共用体在空间开销上要小一点!
但是既然是两个不同的概念当然是不一样的 要不就没必要定义两个名词了
其实在共用体所用的内存中已经写入了数据!当使用其它元素时!上次使用的内容将被覆盖. 也就是说他使几个不同类型的变量共占一段内存(相互覆盖),每次只有一个能使用
结构体则不然, 每个成员都会有存储空间的,可以一起用.内部变量间是相互独立的,c中的结构体和C++里的类很相像~~
只是共同体占用的空间要比结构体小一些 这与他们的原理有关
结构体占用的内存空间,是其元素,占空间的总和,而共用体是,元素中占用空间最大的元素的空间!所以共用体在空间开销上要小一点!
但是既然是两个不同的概念当然是不一样的 要不就没必要定义两个名词了
其实在共用体所用的内存中已经写入了数据!当使用其它元素时!上次使用的内容将被覆盖. 也就是说他使几个不同类型的变量共占一段内存(相互覆盖),每次只有一个能使用
结构体则不然, 每个成员都会有存储空间的,可以一起用.内部变量间是相互独立的,c中的结构体和C++里的类很相像~~
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询