Union trong C

Thứ tư - 01/02/2023 00:04

Union trong C là gì? Cách dùng Union trong C như thế nào? Hãy cùng Quantrimang.com tìm hiểu nhé!

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

Định nghĩa một Union trong C

Để định nghĩa một Union, bạn phải cung cấp câu lệnh union theo cách tương tự như bạn đã định nghĩa structure. Câu lệnh union định nghĩa kiểu dữ liệu mới, với hơn một thành viên trong chương trình của bạn. Dạng của lệnh union như sau:

union [ten_union]
{
   phan dinh nghia thanh vien union;
   phan dinh nghia thanh vien union;
   ...
   phan dinh nghia thanh vien union;
} [mot hoac nhieu bien union];

ten_union là giá trị tùy chọn và một định nghĩa thành là định nghĩa biến thông thường, như int i, hoặc float j và các kiểu định nghĩa biến khác. Ở cuối định nghĩa Union trước dấu chấm phảy cuối cùng, bạn có thể xác định một hoặc nhiều biến Union nhưng nó là tùy chọn. Đây là cách bạn định nghĩa kiểu Union tên QTM với 3 thành viên i, f và chuoi:

union QTM
{
   int i;
   float f;
   char  chuoi[50];
} tenbien;  

Bây giờ kiểu QTM có thể chứa một số nguyên, một số thực và một chuỗi ký tự. Điều này nghĩa là đó là một biến riêng rẽ có cùng vùng nhớ có thể được sử dụng để lưu trữ nhiều kiểu dữ liệu khác nhau. Bạn có thể sử dụng cách kiểu dữ liệu có sẵn hoặc bạn tự định nghĩa bên trong Union dựa vào yêu cầu của bạn.

Bộ nhớ được chiếm dụng bởi Union có độ lớn đủ lớn giữ giá trị của thành phần lớn nhất của Union. Ví dụ, ở ví dụ trên kiểu QTM chứa 20 bytes của bộ nhớ bởi vì nó chứa khoảng nhớ tối đa của đối tượng chuỗi. Dưới đây là ví dụ để hiển thị bộ nhớ tổng cộng của Union trên:

#include <stdio.h>
#include <string.h>
union QTM
{
   int i;
   float f;
   char  chuoi[50];
};
int main( )
{
   union QTM tenbien;        

   printf( "Kich co bo nho bi chiem giu boi tenbien la: %d\n", sizeof(tenbien));
   printf("\n===========================\n");
   printf("QTM chuc cac ban hoc tot! \n");

   return 0;
}

Biên dịch và chạy chương trình C trên sẽ cho kết quả:

Định nghĩa một Union trong C

Truy xuất thành viên của Union trong C

Để truy xuất các thành viên của Union bạn sử dụng toán tử truy xuất thành viên(.). Toán tử truy cập thành viên có vị trí ngăn cách giữa tên biến Union và thành viên mà bạn muốn truy xuất. Chúng ta sẽ sử dụng từ khóa union để định nghĩa kiểu biến Union. Dưới đây là ví dụ cho việc sử dụng Union:

#include <stdio.h>
#include <string.h>
union QTM
{
   int i;
   float f;
   char  chuoi[50];
};
int main( )
{
   union QTM tenbien;        

   tenbien.i = 15;
   tenbien.f = 25.67;
   strcpy( tenbien.chuoi, "Hoc Lap trinh C tai QTM");

   printf( "tenbien.i : %d\n", tenbien.i);
   printf( "tenbien.f : %f\n", tenbien.f);
   printf( "tenbien.chuoi : %s\n", tenbien.chuoi);
   printf("\n===========================\n");
   printf("QTM chuc cac ban hoc tot! \n");

   return 0;
}

Biên dịch và chạy chương trình C trên sẽ cho kết quả:

Truy xuất thành viên của Union trong C

Ở đây bạn có thể hiểu rằng, giá trị thành viên i và f của Union có thể xung đột bởi vì giá trị cuối cùng được gán cho biến đã chiếm trong một vùng nhớ và đó là lý do bạn có thể sử dụng giá trị thành viên chuoi in ra kết quả tốt. Bây giờ hãy xem ví dụ dưới đây khi bạn tập trung vào một biến tại một thời điểm là mục đích chính cho việc sử dụng Union.

#include <stdio.h>
#include <string.h>
union QTM
{
   int i;
   float f;
   char  chuoi[50];
};
int main( )
{
   union QTM tenbien;        

   tenbien.i = 15;
   printf( "tenbien.i : %d\n", tenbien.i);
   tenbien.f = 25.67;
   printf( "tenbien.f : %f\n", tenbien.f);
   strcpy( tenbien.chuoi, "Hoc Lap trinh C tai QTM");
   printf( "tenbien.chuoi : %s\n", tenbien.chuoi);
   printf("\n===========================\n");
   printf("QTM chuc cac ban hoc tot! \n");

   return 0;
}

Biên dịch và chạy chương trình C trên sẽ cho kết quả:

Kết quả sau khi chạy chương trình C

Ở đây, tất cả các thành viên đều được in ra rất tốt bởi vì một thành viên được sử dụng ở một thời điểm.

Điểm tương đồng giữa Structure và Union trong C

  • Cả hai đều là những kiểu dữ liệu tùy biến, chứa đựng các kiểu dữ liệu khác dưới dạng một thực thể đơn lẻ.
  • Các thành phần trong struct và union có thể là mục tiêu của kiểu bất kỳ, chẳng hạn như struct, union hay mảng khác.
  • Cả struct hoặc union đều có thể được chuyển theo giá trị tới một hàm và được trả về giá trí đó bằng hàm. Đối số này sẽ cần có cùng kiểu dưới dạng tham số hàm.
  • Để truy cập các member, bạn cần dùng toán tử ‘.’

Sự khác biệt giữa struct và union

Struct

  • Dùng lệnh struct để xác định một cấu trúc.
  • Mỗi thành viên được gắn một vị trí bộ nhớ đặc biệt.
  • Thay đổi giá trị của một member dữ liệu không ảnh hưởng tới các member dữ liệu khác trong struct.
  • Khởi tạo nhiều member cùng lúc.
  • Có thể chứa nhiều giá trị của các member khác nhau.
  • Kích thước tổng của struct là tổng kích thước của mỗi member dữ liệu.
  • Truy cập hoặc lấy lại bất kỳ member cùng lúc.

Union

  • Dùng từ khóa union để xác định một union.
  • Tất cả member dữ liệu chia sẻ chung một vị trí bộ nhớ.
  • Thay đổi giá trị của một thành viên dữ liệu ảnh hưởng tới giá trị của những thành viên khác.
  • Chỉ có thể khởi tạo thành viên đầu tiên.
  • Một union chứa một giá trị tại một thời điểm cho tất cả member của nó.
  • Kích thước tổng của union là kích thước của thành viên dữ liệu lớn nhất.
  • Bạn có thể truy cập hoặc lấy lại một thành viên tại một thời điểm.

Nguồn tin: Quantrimang.com

Tổng số điểm của bài viết là: 0 trong 0 đánh giá

  Ý kiến bạn đọc

THỐNG KÊ TRUY CẬP
  • Đang truy cập48
  • Máy chủ tìm kiếm1
  • Khách viếng thăm47
  • Hôm nay14,252
  • Tháng hiện tại156,609
  • Tổng lượt truy cập9,862,461
QUẢNG CÁO
Phan Thanh Phú
Quảng cáo 2
Liên kết site
Đăng nhập Thành viên
Hãy đăng nhập thành viên để trải nghiệm đầy đủ các tiện ích trên site
Thăm dò ý kiến

Bạn thấy Website cần cải tiến những gì?

Lịch Âm dương
Máy tính
Bạn đã không sử dụng Site, Bấm vào đây để duy trì trạng thái đăng nhập. Thời gian chờ: 60 giây