D语言联合体

联合体在D提供一个特殊的数据类型,能够存储不同的数据类型相同的内存位置。可以定义一个联合体函有许多成员,但只有一个成员可以在任何给定的时间包含一个值。联合体提供使用相同的存储器位置为多用途的有效方式。

定义一个联合体

要定义联合体,必须使用union语句,非常相似于定义结构体中所做的。 UNION语句定义了一个新的数据类型,为项目不止一个成员。联合体声明的格式如下:

1
2
3
4
5
6
7
union [union tag]
{
member definition;
member definition;
...
member definition;
} [one or more union variables];
union标签是可选的,并且每个成员的定义是正常的变量定义,比如int i; or float f;或任何其他有效的变量定义。在联合体的定义的结尾,最后的分号之前,可以指定一个或多个联合体变量,但它是可选的。这里将定义名为Data联合类型,它有三个成员 i, f, 和str:



1
2
3
4
5
6
union Data
{
int i;
float f;
char str[20];
} data;
现在,数据类型的变量可以存储整数,浮点数,或字符的字符串。这意味着单个变量;即,相同的存储单元可用于存储多个类型的数据。可以根据需要使用联合体内的任何内置或用户定义的数据类型。

联合体所占用的内存将大到足以容纳联合体中最大的成员。例如,在上面的例子中的数据类型将占用20个字节的存储空间,因为这是一个可以由文字串所占用的最大空间。以下是这将显示由上述联合体总占用内存大小的例子:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
import std.stdio;
union Data
{
int i;
float f;
char str[20];
};
int main( )
{
Data data;
writeln( "Memory size occupied by data : ", data.sizeof);
return 0;
}
当上面的代码被编译并执行,它会产生以下结果:
Memory size occupied by data : 20

访问联合体成员

要访问一个联合体的任何成员,我们使用成员访问运算符(.)成员访问运算编码为联合体变量名和成员,使用union关键字来定义联合体类型的变量。下面是例子来解释联合体的用法:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
import std.stdio;
union Data
{
int i;
float f;
char str[13];
};
void main( )
{
Data data;
data.i = 10;
data.f = 220.5;
data.str = "D Programming".dup;
writeln( "size of : ", data.sizeof);
writeln( "data.i : ", data.i);
writeln( "data.f : ", data.f);
writeln( "data.str : ", data.str);
}
当上面的代码被编译并执行,它会产生以下结果:
size of : 16
data.i : 1917853764
data.f : 4.12236e+30
data.str : D Programming

在这里,我们可以看到, i 和联合体f的成员值被损坏了,因为分配给该变量的最终值已经占据了存储位置,这是该值如果str成员能很好的打印。现在,让我们看看同样的例子再一次在这里我们将使用一个变量时,它是具有联合体的主要目的:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
import std.stdio;
union Data
{
int i;
float f;
char str[13];
};
void main( )
{
Data data;
writeln( "size of : ", data.sizeof);
data.i = 10;
writeln( "data.i : ", data.i);
data.f = 220.5;
writeln( "data.f : ", data.f);
data.str = "D Programming".dup;
writeln( "data.str : ", data.str);
}
当上面的代码被编译并执行,它会产生以下结果:


size of : 16
data.i : 10
data.f : 220.5
data.str : D Programming
在这里,所有的成员都得到非常好打印,因为一个成员只在一个时间使用。
联系我们

邮箱 626512443@qq.com
电话 18611320371(微信)
QQ群 235681453

Copyright © 2015-2024

备案号:京ICP备15003423号-3