C – Union

Một union là một kiểu dữ liệu đặc biệt của ngôn ngữ lập trình C, cho phép lưu trữ các kiểu dữ liệu khác nhau trong cùng khu vực bộ nhớ. Bạn có thể định nghĩa một union với nhiều member, nhưng chỉ một member là có thể lưu một giá trị tại một thời điểm. Union cung cấp cách sử dụng bộ nhớ hiệu quả cho nhiều mục đích khác nhau.

Học Lập Trình C - Union

Định nghĩa một Union

Để định nghĩa một union, bạn phải sử dụng từ khóa union theo cách tương tự như cách định nghĩa một cấu trúc (structure). Phát biểu (statement) union định nghĩa một kiểu dữ liệu mới với nhiều member cho chương trình. Định dạng của phát biểu union như sau.

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

Thẻ union tag là tùy chọn và mỗi định nghĩa member là một định nghĩa biến thông thường, như là int i; hoặc float f; hoặc bất kỳ định nghĩa nào khác. Kết thúc của định nghĩa union, trước dấu chấm phẩy (;) cuối cùng, bạn có thể tùy ý chỉ định một hoặc nhiều biến union. Dưới đây là cách để bạn định nghĩa một kiểu union tên Data có ba member i, f, str.

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

Bây giờ, một biến kiểu Data có thể lưu trữ một số nguyên (integer), số thập phân dấu chấm động (floating-point), hoặc một chuỗi (string). Nghĩa là với một biến đơn, ở cùng vị trí bộ nhớ, có thể chứa được nhiều kiểu dữ liệu (data type). Bạn có thể sử dụng kiểu dữ liệu được tích hợp sẵn hoặc do người dùng định nghĩa bên trong union tùy theo nhu cầu của bạn.

Bộ nhớ (memory) bị chiếm bởi một union cần đủ rộng để chứa được member lớn nhất. Như trong ví dụ bên trên, kiểu Data sẽ chiếm 20 byte bộ nhớ bởi vì nó là giá trị lớn nhất của biến chuỗi kí tự str. Ví dụ tiếp theo in kích thước bộ nhớ bị chiếm bởi union trên.

#include <stdio.h>
#include <string.h>
 
union Data {
   int i;
   float f;
   char str[20];
};
 
int main( ) {

   union Data data;        

   printf( "Memory size occupied by data : %d\n", sizeof(data));

   return 0;
}

Đoạn code trên sau khi chạy sẽ in ra kích thước kiểu Data là 20 byte.

Memory size occupied by data : 20

Truy Cập Union Member

Để truy cập member của union, chúng ta sử dụng toán tử truy cập member (.). Toán tử truy cập member là dấu chấm được viết giữa tên biến union và member union mà ta muốn truy cấp. Bạn cần sử dụng từ khóa union để định nghĩa biến kiểu union. Ví dụ sau mô tả cách sử dụng union trong một chương trình.

#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;
}

Đoạn code trên in ra kết quả như bên dưới.

data.i : 1917853763
data.f : 4122360580327794860452759994368.000000
data.str : C Programming

Ở đây, ta thấy rằng giá trị của member if của data không phải là 10 và 220.5 mà chính là giá trị của chuỗi kí tự str. Giá trị của member i f trong union bị sai bởi vì giá trị cuối cùng gán cho biến đã chiếm cùng vị trí bộ nhớ và đây là nguyên nhân giá trị member str được in ra đúng nhất.

Bây giờ, hãy nhìn ví dụ trên một lần nữa, khi chúng ta sử dụng một biến tại mỗi thời điểm, đây chính là mục đích sử dụng của union.

#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;
}

Sau khi biên dịch và thực thi đoạn code trên, nó in ra kết quả sau.

data.i : 10
data.f : 220.500000
data.str : C Programming

Trường hợp này, tất cả member được in ra đúng, bởi vì mỗi member được sử dụng tại mỗi thời điểm.

(Tiếp theo)

Icons made by Freepik from www.flaticon.com