Union trong C là một kiểu dữ liệu đặc biệt có sẵn trong C cho phép lưu trữ các kiểu dữ liệu khác nhau trong cùng một vị trí bộ nhớ. Bạn có thể xác định một liên kết với nhiều thành phần, nhưng chỉ một thành phần có thể chứa một giá trị tại bất kỳ thời điểm nào. Union cung cấp một cách hiệu quả để sử dụng cùng một vị trí bộ nhớ cho nhiều mục đích.
Để xác định union, bạn phải sử dụng câu lệnh union giống như cách bạn đã làm khi xác định một cấu trúc. Câu lệnh union xác định một kiểu dữ liệu mới với nhiều hơn một thành phần cho chương trình của bạn. Định dạng của câu lệnh union như sau:
union [union tag] {
member definition;
member definition;
...
member definition;
} [one or more union variables];
Các thẻ union là tùy chọn và mỗi thành phần là một biến bình thường, chẳng hạn như int i; hoặc float f; hoặc bất kỳ biến hợp lệ nào khác. Khi kết thúc union, trước dấu chấm phẩy cuối cùng, bạn có thể chỉ định một hoặc nhiều biến union tùy chọn. Đây là cách bạn sẽ xác định một loại liên kết có tên là Data có ba thành viên i, f và str:
union Data {
int i;
float f;
char str[20];
} data;
Một biến kiểu dữ liệu có thể lưu trữ một số nguyên, một số dấu phẩy động hoặc một chuỗi các ký tự. Có nghĩa là một biến duy nhất, cùng một vị trí bộ nhớ có thể được sử dụng để lưu trữ nhiều loại dữ liệu.
Bộ nhớ bị chiếm bởi union đủ lớn để giữ thành phần lớn nhất, trong ví dụ trên, kiểu dữ liệu sẽ chiếm 20 byte không gian bộ nhớ vì đây là không gian tối đa có thể bị chiếm bởi một chuỗi ký tự. Ví dụ sau hiển thị tổng kích thước bộ nhớ bị chiếm bởi union trên:
#include
#include
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;
}
Khi mã trên được biên dịch và thực hiện, nó tạo ra kết quả sau:
Memory size occupied by data : 20
Để truy cập bất kỳ thành phần nào của union, chúng tôi sử dụng toán tử. Toán tử truy cập thành phần được mã hóa như một khoảng không gian giữa biến union và thành phần union mà chúng ta muốn truy cập. Bạn sẽ sử dụng liên kết từ khóa để xác định các biến của union. Ví dụ sau đây cho thấy cách sử dụng các union trong một chương trình:
#include
#include
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;
}
Khi mã trên được biên dịch và thực hiện, nó tạo ra kết quả sau:
data.i : 1917853763
data.f : 4122360580327794860452759994368.000000
data.str : C Programming
Ở đây, chúng ta có thể thấy rằng các giá trị của các thành phần i và f bị hỏng vì giá trị cuối cùng được gán cho biến đã chiếm vị trí bộ nhớ và đây là lý do giá trị của thành viên str được in rất tốt.
Bây giờ chúng ta hãy nhìn vào ví dụ một lần nữa, nơi chúng ta sẽ sử dụng một biến tại một thời điểm, đó là mục đích chính của việc có các liên kết:
#include
#include
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;
}
Khi mã trên được biên dịch và thực hiện, nó tạo ra kết quả sau:
data.i : 10
data.f : 220.500000
data.str : C Programming
Ở đây, tất cả các thành viên đều được in rất tốt vì các thành phần đang được sử dụng tại một thời điểm.
Tài liệu về lập trình C: