Trong lập trình C, struct (cấu trúc) là một công cụ hữu ích giúp tổ chức và quản lý dữ liệu phức tạp. Nó cho phép bạn nhóm các kiểu dữ liệu khác nhau thành một cấu trúc duy nhất, tạo điều kiện cho việc quản lý các đối tượng có nhiều thuộc tính như học sinh, sản phẩm, hay điểm trong không gian. Việc hiểu và thành thạo struct sẽ giúp bạn xây dựng các chương trình dễ đọc, dễ quản lý và có cấu trúc rõ ràng hơn.

Trong bài viết này, chúng ta sẽ tìm hiểu chi tiết về struct trong C, bao gồm khái niệm, cách khai báo, sử dụng, và các ứng dụng phổ biến của nó.

1. Struct trong C là gì?

Struct trong C là một kiểu dữ liệu tự định nghĩa cho phép người lập trình nhóm các biến có kiểu dữ liệu khác nhau thành một đơn vị duy nhất. Struct được dùng khi bạn muốn tổ chức các biến liên quan thành một đơn vị logic.

Ví dụ, để lưu trữ thông tin về một sinh viên với tên, tuổi, và điểm số, bạn có thể tạo một struct như sau:

struct SinhVien {
    char ten[50];
    int tuoi;
    float diem;
};

Trong struct SinhVien, bạn có thể lưu trữ tên, tuổi và điểm của sinh viên trong một biến duy nhất.

2. Cách Khai Báo và Khởi Tạo Struct trong C

Khai Báo Struct

Khai báo một struct trong C có thể thực hiện bằng cú pháp như sau:

struct <TênStruct> {
    <Kiu d liu> <Tên thành phn>;
    <Kiu d liu> <Tên thành phn>;
    ...
};

Ví dụ Khai Báo Struct

Hãy xem ví dụ khai báo struct cho một cấu trúc đại diện cho sinh viên:

struct SinhVien {
    char ten[50];
    int tuoi;
    float diem;
};

Trong ví dụ này, SinhVien là tên của struct, với các thành phần ten, tuoi, và diem. Mỗi thành phần này được gọi là thành viên của struct.

Khởi Tạo Struct

Sau khi khai báo, bạn có thể khởi tạo một biến của struct bằng cú pháp:

struct SinhVien sv1;

Bạn cũng có thể khởi tạo với các giá trị ban đầu như sau:

struct SinhVien sv1 = {"Nguyen Van A", 20, 8.5};

Truy Cập Các Thành Viên của Struct

Để truy cập các thành viên của struct, bạn sử dụng dấu . (dấu chấm):

printf("Ten sinh vien: %s\n", sv1.ten);
printf("Tuoi: %d\n", sv1.tuoi);
printf("Diem: %.2f\n", sv1.diem);

3. Struct với Từ Khoá typedef trong C

Để làm cho cú pháp dễ đọc hơn, bạn có thể sử dụng từ khóa typedef để định nghĩa tên mới cho struct. Điều này giúp bạn khai báo các biến struct mà không cần phải viết lại từ struct.

Cú pháp sử dụng typedef

typedef struct {
    char ten[50];
    int tuoi;
    float diem;
} SinhVien;

Bây giờ, bạn có thể khai báo biến SinhVien mà không cần từ khóa struct:

SinhVien sv1 = {"Nguyen Van B", 21, 9.0};

4. Truyền Struct cho Hàm trong C

Bạn có thể truyền struct cho một hàm để xử lý hoặc trả về từ một hàm. Struct có thể được truyền qua tham trị hoặc tham chiếu.

Truyền Qua Tham Trị

Khi truyền struct qua tham trị, một bản sao của struct được truyền vào hàm:

void hienThiThongTin(SinhVien sv) {
    printf("Ten: %s\n", sv.ten);
    printf("Tuoi: %d\n", sv.tuoi);
    printf("Diem: %.2f\n", sv.diem);
}

Truyền Qua Tham Chiếu (Con Trỏ)

Để tăng hiệu suất và tránh tạo bản sao, bạn có thể truyền con trỏ đến struct:

void capNhatDiem(SinhVien *sv, float diemMoi) {
    sv->diem = diemMoi;
}

Trong trường hợp này, -> được sử dụng để truy cập các thành viên của struct thông qua con trỏ.

5. Ứng Dụng Thực Tế của Struct trong C

Struct thường được sử dụng trong nhiều ứng dụng thực tế, bao gồm:

  • Quản lý thông tin người dùng: Lưu trữ thông tin như tên, tuổi, địa chỉ.
  • Dữ liệu hình học: Mô tả điểm, hình tròn, hình vuông,…
  • Xử lý tệp tin: Lưu trữ thông tin về tệp như tên tệp, kích thước, quyền truy cập.
  • Mảng Struct: Quản lý nhiều đối tượng có cùng cấu trúc như danh sách sinh viên hoặc danh sách sản phẩm.

Ví dụ Ứng Dụng Thực Tế: Quản Lý Thông Tin Sách

Hãy xem ví dụ về chương trình quản lý thông tin sách:

#include <stdio.h>

typedef struct {
    char tenSach[50];
    char tacGia[50];
    int namXuatBan;
} Sach;

void hienThiThongTinSach(Sach s) {
    printf("Ten sach: %s\n", s.tenSach);
    printf("Tac gia: %s\n", s.tacGia);
    printf("Nam xuat ban: %d\n", s.namXuatBan);
}

int main() {
    Sach sach1 = {"Lap Trinh C", "Nguyen Van A", 2021};

    hienThiThongTinSach(sach1);

    return 0;
}

Giải Thích Chương Trình

Chương trình này định nghĩa một struct Sach với các thuộc tính như tenSach, tacGia, và namXuatBan. Sau đó, một biến sach1 được khởi tạo và thông tin về cuốn sách được hiển thị.

6. Mảng Struct và Struct Lồng Nhau

Mảng Struct

Bạn có thể tạo mảng struct để quản lý nhiều đối tượng cùng kiểu dữ liệu. Ví dụ, để quản lý danh sách 100 sinh viên:

SinhVien danhSachSV[100];

Struct Lồng Nhau

Bạn có thể sử dụng struct bên trong một struct khác. Ví dụ:

typedef struct {
    int ngay;
    int thang;
    int nam;
} NgayThang;

typedef struct {
    char ten[50];
    NgayThang ngaySinh;
} SinhVien;

7. Tổng Kết

Struct là một công cụ mạnh mẽ trong lập trình C, giúp bạn nhóm các biến thành một đơn vị logic và dễ quản lý. Từ việc quản lý thông tin đơn giản đến cấu trúc dữ liệu phức tạp, struct cung cấp cho lập trình viên khả năng tổ chức và truy cập dữ liệu một cách hiệu quả. Hy vọng rằng bài viết này giúp bạn hiểu rõ hơn về cách sử dụng struct trong C và áp dụng nó vào các dự án lập trình của mình.