Kiểu dữ liệu union và enum - Lập trình C: Bài 16

Kiểu dữ liệu union và enum - Lập trình C: Bài 16
access_time 10/14/2019 12:00:00 AM
person Lê Đình Thành

Kiểu dữ liệu Union và Enum – Lập trình C : Bài 16

1. Kiểu dữ liệu Union

Kiểu dữ liệu Union là kiểu dữ liệu có cấu trúc, tương tự như struct, union chứa một tập hợp các thành phần (member hoặc biến) có kiểu dữ liệu khác nhau. Điểm khác giữa struct và union là các thành phần trực thuộc union đều lưu trữ tại cùng một địa chỉ. Kích cỡ lưu trữ của Union là kích cỡ của một thành phần có chứa dữ liệu lớn nhất.

Tại một thời điểm, union chỉ lưu trữ thông tin của một trường duy nhất. Chính vì vấn đề này mà các lập trình viên phải hết sức lưu ý vì khi thiết lập thông tin của một member thì các thông tin của member khác sẽ bị ảnh hưởng, có nghĩa khi một giá trị mới được gán cho một member thì dữ liệu đã tồn tại sẽ được thay thế mới dữ liệu mới.

Union được định danh trong C thông qua từ khóa union, có vị trí giống như từ khóa struct. Kiểu uion là tiết kiệm bộ nhớ, chúng được sử dụng trong chương trình có sự tham gia của nhiều member mà các giá trị của các member không nhất thiết phải có giá trị tại một thời điểm.

1.1. Khai báo Union

Cú pháp

union tag_name

  {

  member1;

  member2;

      .

      .

  memberN;

  }variable1,variable2,variable3,…,variableX;

Hoặc có thể khai báo riêng rẽ như sau :

union tag_name

  {

  member1;

  member2;

      .

      .

  memberN;

  };

union tag_name variable1,variable2,…,variableX;

Trong đó :

 tag_name : Tên union

 member: Các thành phần trực thuộc union

variable: Các biến của union

Ví dụ :

union mixed

{

  char letter;

  float radian;

  int number;

 };

 union mixed all;

Trong ví dụ trên các members “ letter có kích cỡ 1 bytes, radian có kích cỡ 4 bytes, int có kích cỡ 2 byte. Do vậy kích cỡ của union mixed = 4 bytes.

Hình ảnh minh họa


Hình số 1 : 3 thành phần union chia sẻ bộ nhớ lưu trữ

1.2. Truy vấn và khởi tạo các member trực thuộc Union

Giống như kiểu dữ liệu struct, các member trực thuộc union được truy vấn thông qua toán tử ‘.’.

Cú pháp:

variable1.member1

variable2.member2

  .

  .

  .

variableX.memberN

Trong đó:

variable: Các biến thể hiện của kiểu dữ liệu union.

member : Các thành phần của union

Để thiết lập giá trị của các member trực thuộc union, chúng ta sử dụng toán tử gán “=”.

Cú pháp

variableX.memberN = constant;

trong đó :

variableX : Các biến thể hiện kiểu dữ liệu union

memberN : Thành phần thứ N trực thuộc union.

constant: Hằng giá trị

Ví dụ:


Hình số 2 : Khai báo, thiết lập giá trị struct

Trong ví dụ trên với dữ liệu struct POINT1 p1 = {2, 3}; được sử dụng để thiết lập giá trị cho biến p1;

Tuy nhiên với union POINT2 p2 thì không thể sử dụng union POINT2 p2 = {4 , 5 } được vì tại một thời điểm chỉ được phép thiết lập giá trị của một member trực thuộc union do vậy chỉ có thể

p2.x = 4;

Vì x, y cùng kiểu do vậy nếu chỉ thiết lập p2.x = 4 thì khi đó p2.y == 4;

Ngược lại nếu thiết lập tiếp p2.y = 5 thì khi đó giá trụ của p2.x == 5;

Các vấn đề làm và không được làm với union.

+ Một biến kiểu union có thể gán cho một biến kiểu cùng kiểu uion khác.

+ Có thể sử dụng biến uion là tham số hình thức hay tham trị của hàm.

+ Để truy vấn địa chỉ của biến union, chúng ta sử dụng toán tử tham chiếu ‘&’.

+ Không được phép khởi tạo đồng thời nhiều member của union

+ Kích cỡ của union bằng với kích cỡ của member lớn nhất trực thuộc union.

+ Các phép toán đại số và Logic không được thực hiện trên Union.

1.3. Mảng union

Giống như struct, có thể sử dụng mảng để lưu kiểu dữ liệu union. Tuy nhiên chỉ cần lưu ý là union tại một thời điểm chỉ có một member có chứa giá trị.

Ví dụ:

Sử dụng mảng để lưu trữ union, sau đó in các giá trị member trực thuộc uinion.


Hình số 3 : Mảng lưu trữ Union

2. Kiểu dữ liệu ENUM

Kiểu dữ liệu enum hay còn gọi là kiểu dữ liệu liệt kê, các thành phần trong kiểu dữ liệu liệt kê sẽ có giá trị là một hằng integer.

Cú kháp khai báo

enum tag_name{member1, member2,…, memberN} variable1,...,variableX;

Hoặc

enum tag_name{member1, member2,…, memberN};

enum tag_name variable1,...,variableX;

Trong đó :

tag_name: Tên enum;

member: Các thành phần trực thuộc enum.

variable: Biến có kiểu dữ liệu enum.

Ví dụ:

enum days {Mon, Tues, Wed, Thurs, Fri, Sat, Sun};

Khi đó các giá trị của các member là :

Mon == 0; Tues ==1; Wed ==2; Thurs == 3; Fri == 4; Sat == 5; Sun == 6;

Code minh họa


Hình số 4 : Kiểu dữ liệu enum

 

Khi khai báo enum chúng ta có thể thiết lập giá trị khởi tạo cho một hay nhiều member trực thuộc.

Ví dụ

enum coins{ p1=1, p2, p5=5, p10=10, p20=20, p50=50 };

Khi đó tự thiết lập giá trị p2 = 2 vì trước đó p1 = 1;


vertical_align_top
share
Chat...