聯(lián)合體在D提供一個(gè)特殊的數(shù)據(jù)類型,能夠存儲不同的數(shù)據(jù)類型相同的內(nèi)存位置??梢远x一個(gè)聯(lián)合體函有許多成員,但只有一個(gè)成員可以在任何給定的時(shí)間包含一個(gè)值。聯(lián)合體提供使用相同的存儲器位置為多用途的有效方式。
要定義聯(lián)合體,必須使用union語句,非常相似于定義結(jié)構(gòu)體中所做的。 UNION語句定義了一個(gè)新的數(shù)據(jù)類型,為項(xiàng)目不止一個(gè)成員。聯(lián)合體聲明的格式如下:
union [union tag] { member definition; member definition; ... member definition; } [one or more union variables];
union標(biāo)簽是可選的,并且每個(gè)成員的定義是正常的變量定義,比如int i; or float f;或任何其他有效的變量定義。在聯(lián)合體的定義的結(jié)尾,最后的分號之前,可以指定一個(gè)或多個(gè)聯(lián)合體變量,但它是可選的。這里將定義名為Data聯(lián)合類型,它有三個(gè)成員 i, f, 和str:
union Data { int i; float f; char str[20]; } data;
現(xiàn)在,數(shù)據(jù)類型的變量可以存儲整數(shù),浮點(diǎn)數(shù),或字符的字符串。這意味著單個(gè)變量;即,相同的存儲單元可用于存儲多個(gè)類型的數(shù)據(jù)??梢愿鶕?jù)需要使用聯(lián)合體內(nèi)的任何內(nèi)置或用戶定義的數(shù)據(jù)類型。
聯(lián)合體所占用的內(nèi)存將大到足以容納聯(lián)合體中最大的成員。例如,在上面的例子中的數(shù)據(jù)類型將占用20個(gè)字節(jié)的存儲空間,因?yàn)檫@是一個(gè)可以由文字串所占用的最大空間。以下是這將顯示由上述聯(lián)合體總占用內(nèi)存大小的例子:
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; }
當(dāng)上面的代碼被編譯并執(zhí)行,它會產(chǎn)生以下結(jié)果:
Memory size occupied by data : 20
要訪問一個(gè)聯(lián)合體的任何成員,我們使用成員訪問運(yùn)算符(.)成員訪問運(yùn)算編碼為聯(lián)合體變量名和成員,使用union關(guān)鍵字來定義聯(lián)合體類型的變量。下面是例子來解釋聯(lián)合體的用法:
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); }
當(dāng)上面的代碼被編譯并執(zhí)行,它會產(chǎn)生以下結(jié)果:
size of : 16 data.i : 1917853764 data.f : 4.12236e+30 data.str : D Programming
在這里,我們可以看到, i 和聯(lián)合體f的成員值被損壞了,因?yàn)榉峙浣o該變量的最終值已經(jīng)占據(jù)了存儲位置,這是該值如果str成員能很好的打印?,F(xiàn)在,讓我們看看同樣的例子再一次在這里我們將使用一個(gè)變量時(shí),它是具有聯(lián)合體的主要目的:
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); }
當(dāng)上面的代碼被編譯并執(zhí)行,它會產(chǎn)生以下結(jié)果:
size of : 16 data.i : 10 data.f : 220.5 data.str : D Programming
在這里,所有的成員都得到非常好打印,因?yàn)橐粋€(gè)成員只在一個(gè)時(shí)間使用。