C语言中的联合

时间:2020-02-23 14:32:07  来源:igfitidea点击:

今天,我们讨论C编程列表中最高级的主题之一-Union。

了解C语言中的联合

" Union in C"是用户定义的数据类型,它使用户可以将不同类型的元素一起存储到其中。

我们可以其中定义各种数据成员/变量,但一次只能有一个数据变量占用联合中的内存。

因此,可以说联合的大小或者内存等于其中存在的最大数据成员的大小。
因此,所有数据变量在联合中共享相同的存储位置。

通过这种方式,Union提供了一种有效的方法,可以将相同数量的内存或者空间重新用于多个目的。

在介绍了基础知识之后,接下来定义一个联合。

如何在C中定义并集?

联合帮助我们定义存储不同数据类型值的数据变量,如下所示:

语法:

union union-name {
 data member1 definition ;
 data member2 definition;
 ...
 data memberN definition;
}  

  • 关键字union用于声明联合结构。

  • 此外,"工会名称"是工会的名称,可以帮助我们在整个程序中访问工会。

  • 我们可以在一个联合中定义不同数据类型的多个数据成员。

例:

union Info {
 int roll;
 float marks;
 char name[50];
} info_obj;  

在上面的示例中,我们创建了一个联合" Info"并定义了不同数据类型的变量,例如int,float,char等。

Union使用相同的内存空间/大小来存储不同数据类型的值,从而增加了空间的可重用性。

联合的内存空间是其中声明的最大数据成员的大小。

在上面的示例中,最大的变量"名称"占用50个字节的空间。
因此,联合" Info"也将代表50个字节的存储空间。

创建联合变量

联合变量帮助联合类型根据最大的数据成员分配内存空间。

创建联合变量有两种方法:

方法1:

union union-name {
 data member1 definition ;
 data member2 definition;
 ...
 data memberN definition;
}  union_variable 1, union_variable2, .... , union_variableN;

方法2:

union union-name {
 data member1 definition ;
 data member2 definition;
 ...
 data memberN definition;
};

int main()
{
union union-name union_variable 1, union_variable2, ... ,union_variableN;
return 0;
}

访问联盟数据成员

为了给联合类型中定义的数据成员赋值,我们需要使用联合变量来访问它们。

有两种访问联合数据成员的技术:

方法1:使用`(。
)运算符

union_variable.data_member = value;

方法2:使用"箭头(->)运算符"

union_variable->data_member = value;

让我们看下面的示例,以理解上面解释的概念。

#include<stdio.h>
union Info {
 int roll;
 float marks;
 char name[100];
} info_obj;  

int main() {
 info_obj.roll = 1;
 info_obj.marks = 82.5;
 
 printf("Roll number :  %d\n", info_obj.roll);
 printf("Marks obtained :  %.1f",  info_obj.marks);
 return 0;
}

在下面的输出中,只有最后一个变量"标记"正确显示。

这是因为,您可以看到变量" info_obj"同时访问变量" marks"和" roll"。
由于内存位置是共享的,因此在输出期间仅最后一个值会保留内存。
先前声明的变量" roll"已损坏。

这可以证明我们有关Union数据类型共享内存位置的初始声明。

输出:

Roll number :  1118109696
Marks obtained :  82.5

看下面的例子看看有什么区别!

#include<stdio.h>
union Info {
 int roll;
 float marks;
 char name[100];
} info_obj;  

int main() {
 info_obj.roll = 1;
 printf("Roll number :  %d\n", info_obj.roll);
 info_obj.marks = 82.5;
 printf("Marks obtained :  %.1f",  info_obj.marks);
 return 0;
}

现在,数据变量" roll"和" marks"都可以正确显示。
原因是,这里的联合变量" info_obj"一次访问一个变量并显示该值,然后继续获取另一个数据成员。

输出:

Roll number :  1
Marks obtained :  82.5

结构与联合之间的差异

考虑以下示例,以了解结构和联合之间的区别:

#include <stdio.h>  
union u_Info {
 int roll;
 float marks;
 char name[100];
} u_obj;  

struct s_Info {
 int roll;
 float marks;
 char name[100];
} s_obj;  

int main()
{
 printf("Size -- Structure datatype = %d\n", sizeof(s_obj));
 printf("Size -- Union datatype = %d", sizeof(u_obj));
 return 0;
}

Union占用其中存在的最大变量的存储空间。
其中变量"名称"具有100个字节的空间。
因此,并集的大小为100个字节。

另一方面,结构占用的内存大小是内存中所有数据成员大小的总和。
因此,结构表示108个字节的内存大小。

输出:

Size -- Structure datatype = 108
Size -- Union datatype = 100