Cprogramming 简明教程
Unions in C
Unions in C
union 是 C 语言中提供的特殊数据类型,允许在同一内存位置存储不同的 data types 。你可以定义一个有多个成员的联合,但任何给定时间的只有一个成员可以包含值。联合提供了对使用同一内存位置进行多种用途的有效方式。
联合的所有成员共享同一内存位置。因此,如果我们需要对两个或更多成员使用同一内存位置,那么联合是对此而言的最佳数据类型。最大的联合成员定义联合的大小。
Accessing the Union Members
要访问联合的任何成员,我们需要使用成员访问运算符 (.)。成员访问运算符编码为联合变量名和我们希望访问的联合成员之间的句点。你应该使用关键字联合来定义联合类型的变量。
Examples of Union
Example 1
以下示例展示了如何在程序中使用联合 −
#include <stdio.h>
#include <string.h>
union Data{
int i;
float f;
char str[20];
};
int main(){
union Data data;
data.i = 10;
data.f = 220.5;
strcpy(data.str, "C Programming");
printf("data.i: %d \n", data.i);
printf("data.f: %f \n", data.f);
printf("data.str: %s \n", data.str);
return 0;
}
编译并执行上述代码后,将产生以下结果 −
data.i: 1917853763
data.f: 4122360580327794860452759994368.000000
data.str: C Programming
在此,我们可以看到 i 和 f (联合的成员) 的值显示 garbage values ,因为分配给变量的最终值占据了内存位置,这就是 str 成员值能够很好地打印出来的原因。
Example 2
现在,让我们再次看一下同一个示例,其中我们将一次使用一个变量,这是拥有联合的主要目的 −
#include <stdio.h>
#include <string.h>
union Data{
int i;
float f;
char str[20];
};
int main(){
union Data data;
data.i = 10;
printf("data.i: %d \n", data.i);
data.f = 220.5;
printf("data.f: %f \n", data.f);
strcpy(data.str, "C Programming");
printf("data.str: %s \n", data.str);
return 0;
}
编译并执行上述代码后,将产生以下结果 −
data.i: 10
data.f: 220.500000
data.str: C Programming
在此,所有联合成员的值都能很好地打印出来,因为一次只使用一个成员。
Size of a Union
联合的大小是其最大成员的大小。例如,如果一个联合包含 char 和 int 类型的两个成员。在这种情况下,联合的大小将是 int 的大小,因为 int 是最大的成员。
你可以使用 sizeof() operator 来获取联合的大小。
Example
在以下示例中,我们正在打印一个联合的大小 −
#include <stdio.h>
// Define a union
union Data {
int a;
float b;
char c[20];
};
int main() {
union Data data;
// Printing the size of the each member of union
printf("Size of a: %lu bytes\n", sizeof(data.a));
printf("Size of b: %lu bytes\n", sizeof(data.b));
printf("Size of c: %lu bytes\n", sizeof(data.c));
// Printing the size of the union
printf("Size of union: %lu bytes\n", sizeof(data));
return 0;
}
当你编译并执行该代码时,它将生成以下输出 −
Size of a: 4 bytes
Size of b: 4 bytes
Size of c: 20 bytes
Size of union: 20 bytes
Difference between Structure and Union
structures 和联合都是 C 编程中的复合数据类型。结构和联合之间最显著的区别是它们存储数据的方式。结构将每个成员存储在单独的内存位置中,而联合将所有成员存储在同一个内存位置中。
以下是名为 myunion 的联合类型的定义 −
union myunion{
int a;
double b;
char c;
};
联合的定义类似于结构的定义。“struct type mystruct”的定义,其元素相同,如下所示 −
struct mystruct{
int a;
double b;
char c;
};
结构和联合之间的主要区别是变量的大小。编译器将内存分配给结构变量,以便能够为所有元素存储值。在 mystruct 中,有三个元素 − 一个 int、一个 double 和一个 char,需要 13 个字节 (4 + 8 + 1)。因此, sizeof(struct mystruct) 返回 13。
另一方面,对于联合类型变量,编译器开辟一块大小足以容纳字节大小最大的元素的内存块。 myunion 具有 int、double 和 char 元素。在三个元素中,double 变量的大小最大,即为 8。因此, sizeof(union myunion) 返回 8。
另一个需要考虑的问题是联合变量只能包含其一个元素的值。当为一个元素分配值时,其他元素是未定义的。如果您尝试使用其他元素,将导致一些内存垃圾。
Example 1: Memory Occupied by a Union
在以下代码中,我们定义了一个名为 Data 的联合类型,其包含三个成员 i 、 f 和 str 。 Data 类型的变量可以存储整数、浮点数或一系列字符。这意味着可以将一个变量(即相同存储器位置)用于存储多种类型的数据。您可以根据自己的需求在联合中使用任何内置或用户定义的数据类型。
联合占用的内存将足够存储联合中最大的成员。例如,在上述示例中, Data 将占用 20 字节的存储空间,因为这是字符串可以占用的最大空间。
以下示例显示了上一个联合占据的总内存大小 −
#include <stdio.h>
#include <string.h>
union Data{
int i;
float f;
char str[20];
};
int main(){
union Data data;
printf("Memory occupied by Union Data: %d \n", sizeof(data));
return 0;
}
当你编译并执行该代码时,它将生成以下输出 −
Memory occupied by Union Data: 20
Example 2: Memory Occupied by a Structure
现在,让我们创建一个具有相同元素的结构并检查它在内存中占用了多少空间。
#include <stdio.h>
#include <string.h>
struct Data{
int i;
float f;
char str[20];
};
int main(){
struct Data data;
printf("Memory occupied by Struct Data: %d \n", sizeof(data));
return 0;
}
此结构将占用 28 个字节 (4 + 4 + 20)。运行代码并检查其输出 −
Memory occupied by Struct Data: 28