D 程式設計 - 聯合體



聯合體是 D 中一種特殊的資料型別,它允許您在同一記憶體位置儲存不同的資料型別。您可以定義一個包含多個成員的聯合體,但在任何給定時間,只有一個成員可以包含值。聯合體提供了一種有效的方式來將同一記憶體位置用於多種用途。

在 D 中定義聯合體

要定義一個聯合體,您必須使用與定義結構體非常相似的方式使用 union 語句。union 語句定義了一種新的資料型別,其中包含程式的多個成員。union 語句的格式如下:

union [union tag] { 
   member definition; 
   member definition; 
   ... 
   member definition; 
} [one or more union variables]; 

聯合體標籤是可選的,每個成員定義都是一個正常的變數定義,例如 int i; 或 float f; 或任何其他有效的變數定義。在聯合體定義的末尾,在最後一個分號之前,您可以指定一個或多個聯合體變數,但這是可選的。以下是如何定義一個名為 Data 的聯合體型別,它具有三個成員ifstr

union Data { 
   int i; 
   float f; 
   char str[20]; 
} data; 

Data 型別的變數可以儲存整數、浮點數或字串。這意味著單個變數(同一記憶體位置)可用於儲存多種型別的資料。您可以根據需要在聯合體中使用任何內建或使用者定義的資料型別。

聯合體佔用的記憶體將足夠大以容納聯合體中最大的成員。例如,在上面的示例中,Data 型別將佔用 20 位元組的記憶體空間,因為這是字元字串可以佔用的最大空間。以下示例顯示了上述聯合體佔用的總記憶體大小:

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 關鍵字來定義聯合體型別的變數。

示例

以下示例說明了聯合體的用法:

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

在這裡,您可以看到聯合體的if成員的值已損壞,因為分配給變數的最終值已佔據了記憶體位置,這就是str成員的值被很好地打印出來的原因。

現在讓我們再次檢視同一個示例,其中我們將一次使用一個變數,這是使用聯合體的主要目的:

修改後的示例

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

在這裡,所有成員都被很好地打印出來,因為一次只使用了一個成員。

廣告