Kiểu Union và Kiểu liệt kê Enum trong lập trình C/C++


Trong quá trình lập trình vi xử lý, sẽ có lúc bạn cần tìm hiểu 2 kiểu dữ liệu Union và Enum, xem bài lý thuyết sau nhé
BÀN VỀ KIỂU UNION
Kiểu union là một dạng cấu trúc dữ liệu đặc biệt của ngôn ngữ C. Nó rất giống với kiểu struct. Chỉ khác một điều, trong kiểu union, các trường được phép dùng chung một vùng nhớ. Hay nói cách khác, cùng một vùng nhớ ta có thể truy xuất dưới các dạng khác nhau.
Khai báo tổng quát của kiểu union như sau:
C Code:
  1. typedef union <tên kiểu union>
  2. {
  3.      <kiểu dữ liệu> <tên trường>;
  4.      <kiểu dữ liệu> <tên trường>;
  5.      ……… // còn nhiều trường nữa
  6. } [<Name>];
Ví dụ, ta có thể định nghĩa kiểu số sau:
C Code:
  1. typedef union tagNumber
  2. {
  3.     int i;
  4.     long l;
  5. }  Number;
Ồ, sao mà giống kiểu struct vậy ta, 2 thằng này là một sao? Hi, không phải vậy đâu, sự việc là như thế này: việc truy xuất đến một trường trong union được thực hiện hoàn toàn giống như trong struct. Giả sử có biến n kiểu Number. Khi đó, n.i cho ta một số kiểu int còn n.l cho ta một số kiểu long, nhưng cả hai đều dùng chung một vùng nhớ. Vì vậy, khi ta gán
n.l = 3000;
thì giá trị của n.i cũng bị thay đổi (n.i sẽ bằng 3000);
Việc dùng kiểu union rất có lợi khi cần khai báo các CTDL mà nội dung của nó thay đổi tùy trạng thái. Ví dụ để mô tả các thông tin về một con người ta có thể khai báo một kiểu dữ liệu như sau:
C Code:
  1. struct tagNguoi
  2. {
  3.   char HoTen[35];
  4.   int NamSinh;
  5.   char NoiSinh[40];
  6.   char GioiTinh; //0: Nữ, 1: Nam
  7.   char DiaChi[50];
  8.   char Ttgd; //0:Không có gia đình, 1: Có gia đình
  9.   union
  10.   {
  11.       char tenVo[35];
  12.       char tenChong[35];
  13.   }
  14. } Nguoi;
Tùy theo người mà ta đang xét là nam hay nữ ta sẽ truy xuất thông tin qua trường có tên tenVo hoặc tenChong.

BÀN VỀ ENUM (kiểu liệt kê)
Kiểu dữ liệu liệt kê dùng để tạo ra các kiểu dữ liệu chứa một cái gì đó hơi đặc biệt một chút, không phải kiểu số hay kiểu kí tự hoặc các hằng true và false. Dạng thức của nó như sau:
Syntax Code:
  1. <enum> <tên enum>
  2. {
  3.      giá trị 1 = giá trị gì đó,
  4.      giá trị 2 = giá trị gì đó,
  5.      giá trị 3 = giá trị gì đó,
  6.      ...
  7. }
Lưu ý: giữa các giá trị trong enum được cách bằng dấu phẩy (,) chứ không phải là dấu chấm phải ( đâu nhé. Không cẩn thận là chẳng biết đâu mà debug đâu
Để minh họa mình cho 1 ví dụ minh họa, thông thường ví dụ cổ điển là tạo kiểu enum chứa các giá trị các ngày trong tuần
C Code:
  1. enum NgayTrongTuan
  2. {
  3.      ThuHai = 2;
  4.      ThuBa = 3;
  5.      ThuTu = 4;
  6.      ThuNam = 5;
  7.      ThuSau = 6;
  8.      ThuBay = 7;
  9.      ChuNhat = 8;
  10. }
Bây giờ tôi muốn sử dụng nó thì sao nhỉ, còn chờ gì nữa, hãy làm tương tự như kiểu struct và union như thế này này:
C Code:
  1. // tạo 3 biến HomQua, HomNay,NgayMai kiểu enum NgayTrongTuan
  2. NgayTrongTuan HomQua,HomNay,NgayMai;
Nãy giờ xem ví dụ, các bạn có để ý điều gì không nhỉ,à, thấy rồi, kiểu enum đơn giản là 1 tập hợp các const (hằng số),nó sẽ thay thế những hằng số vô hồn (2,3,..,8) bằng những chữ cái dễ nhớ.
Thay vì ta ghi:
C Code:
  1. #define ThuHai 2
  2. #define ThuBa 3
  3. ...
thì ta có thể dùng kiểu enum như trên.
Để hiểu hơn, chúng ta chơi thêm 1 ví dụ nữa nhé:
C Code:
  1. enum color
  2. {
  3.     black,
  4.     blue,
  5.     green,
  6.     cyan,
  7.     red,
  8.     purple,
  9.     yellow,
  10.     white,
  11. }
  12. color myColor;
  13. myColor = blue;
  14. if (myColor == green) myColor=red;
Chú ý rằng chúng ta không sử dụng bất kì một kiểu dữ liệu cơ bản nào trong phần khai báo. Chúng ta đã tạo ra một kiểu dữ liệu mới mà không dựa trên bất kì kiểu dữ liệu nào có sẵn: kiểu color, những giá trị có thể của kiểu color được viết trong cặp ngoặc nhọn {}

Trên thực tế kiểu dữ liệu liệt kê được dịch là một số nguyên và các giá trị của nó là các hằng số nguyên được chỉ định. Nếu điều này không đựoc chỉ định, giá trị nguyên tương đương với phần tử đầu tiên là 0 và các giá trị tiếp theo cứ thế tăng lên 1, Vì vậy, trong kiểu dữ liệu color mà chúng ta định nghĩa ở trên, white tương đương với 0, blue tương đương với 1, green tương đương với 2 và cứ tiếp tục như thế.
Nếu chúng ta chỉ định một giá trị nguyên cho một giá trị nào đó của kiểu dữ liệu liệt kê thì các giá trị tiếp theo sẽ là các giá trị nguyên tiếp theo.

Nhận xét

Bài đăng phổ biến từ blog này

Cài đặt thư viện của ESP32 để lập trình trong Arduino