Trước khi vào bài, tôi xin phép tạm dịch struct sang nghĩa Tiếng Việt là cấu trúc. Đôi khi trong bài hoặc là tôi sẽ gọi là struct hoặc là tôi sẽ gọi là cấu trúc (bạn đọc hiểu là tương đương nhau)

1.Kiểu dữ liệu struct là gì?

Một struct (hay cấu trúc) là một thành phần bao gồm nhiều thành phần dữ liệu, không cần thiết là có cùng kiểu dữ liệu và được gom nhóm lại với nhau.

Việc khai báo và sử dụng một struct, chính là việc tạo ra và sử dụng một kiểu dữ liệu mới do người lập trình định nghĩa.

Một ví dụ để dễ hình dung hơn về struct:

Giả sử tôi có một sinh viên bao gồm các thông tin như:

  1. Mã sinh viên
  2. Tên sinh viên
  3. Điểm sinh viên

Như vậy tôi có thể tạo ra một struct sinh viên trong đó mã sinh viên mang kiểu int (số nguyên), tên sinh viên mang kiểu char (ký tự) và điểm sinh viên sẽ mang kiểu float (số thực)

2.Khai báo một struct

Để khai báo một struct trong chương trình C, ta sử dụng cú pháp sau đây:

struct name
{
    data_type member1;
    data_type member2;
    ...
    ...
    data_type memberN;
};

Trong đó:

  • Name: Là tên của cấu trúc
  • Data_type: Là kiểu dữ liệu của một phần tử có trong cấu trúc
  • Member: Là tên các phần từ có kiểu dữ liệu Data_type nằm trong cấu trúc

Chú ý: Việc khai báo một cấu trúc luôn được đặt bên ngoài hàm main.

Ví dụ dưới đây, tôi khai báo một cấu trúc sinh viên bao gồm các thông tin như:

  1. Mã sinh viên (int)
  2. Tên sinh viên (char)
  3. Điểm sinh viên (float)
struct sinhvien{
    int MaSinhVien;
    char TenSinhVien[25];
    float DiemSinhVien;
};

3.Khởi tạo và sử dụng một struct

Khi một cấu trúc đã được định nghĩa, chúng ta có thể khai báo một hoặc nhiều biến kiểu dữ liệu struct này trong hàm main hoặc bất kỳ hàm nào cần sử dụng.

Tiếp tục với ví dụ trên, tôi tạo ra nhiều sinh viên trong hàm main và chúng đều có kiểu struct sinh viên mà tôi đã đĩnh nghĩa ở trên.

#include <stdio.h>
struct sinhvien{
    int MaSinhVien;
    char TenSinhVien[25];
    float DiemSinhVien;
};
int main(){
    struct sinhvien NguyenVanA;
    struct sinhvien NguyenVanB;
    struct sinhvien NguyenVanC;
}

Như vậy tôi có NguyenVanA, NguyenVanB, NguyenVanC là 3 sinh viên cùng có kiểu struct sinhvien mà tôi đã đĩnh nghĩa ở trên.

Tiếp theo, để khởi tạo các giá trị cho các thành phần có trong cấu trúc ta có thể truy cập trực tiếp vào các thành phần đó và gán giá trị cho chúng như sau:

#include <stdio.h>
struct sinhvien{
    int MaSinhVien;
    char TenSinhVien[25];
    float DiemSinhVien;
};
int main(){
    struct sinhvien NguyenVanA = {1,"NguyenVanA",10.0};
    struct sinhvien NguyenVanB = {2,"NguyenVanB", 7.0};
    struct sinhvien NguyenVanC = {3,"NguyenVanC", 5.0};
}

Giải thích:

  • 1,2,3 là mã các sinh viên
  • NguyenVanA, NguyenVanB, NguyenVanC là tên các sinh viên
  • 10.0, 7.0, 5.0 là điểm các sinh viên

Quy tắc gán giá trị cũng phải gán giá trị lần lượt, tuân theo việc khai báo thành phần nào đứng trước, thành phần nào đứng sau ở trong struct sinh viên đã định nghĩa ban đầu.

4.Từ khóa typedef với kiểu dữ liệu struct

Khi khai báo và sử dụng một cấu trúc (Ví dụ cấu trúc sinh viên ở trên), ta thường phải viết theo từ khóa struct đặt ở trước. Ví dụ như:

struct sinhvien NguyenVanA = {1,"NguyenVanA",10.0};

Việc viết như vậy là không sai, tuy nhiên ta thấy rằng câu lệnh khá dài và đôi khi làm bị rối.

Vì thế từ khóa typedef xuất hiện để giúp ta định nghĩa lại một cấu trúc sao cho việc khai báo thuận tiện và dễ dàng hơn.

Khi có sự xuất hiện của typedef ta không cần nhắc lại từ khóa struct khi khai báo biến cấu trúc. Để làm việc đó ta cần thực hiện việc đặt từ khóa typedef ngay khi khởi tạo một cấu trúc, ta sẽ đặt từ khóa typedef cho cấu trúc đó. Ở đây tôi ví dụ cho cấu trúc sinh viên (các cấu trúc khác cũng làm tương tự)

struct sinhvien{
    int MaSinhVien;
    char TenSinhVien[25];
    float DiemSinhVien;
};
typedef sinhvien SV;

Khi đặt từ khóa typedef sinhvien SV có nghĩa là việc khai báo sau này ta chỉ cần gọi SV NguyenVanA thay vì gọi struct sinhvien NguyenVanA

#include <stdio.h>
struct sinhvien{
    int MaSinhVien;
    char TenSinhVien[25];
    float DiemSinhVien;
};
typedef sinhvien SV;
int main(){
    SV NguyenVanA = {1,"NguyenVanA",10.0};
    SV NguyenVanB = {2,"NguyenVanB", 7.0};
    SV NguyenVanC = {3,"NguyenVanC", 5.0};
}