Giới thiệu
Bạn đã biết về mảng trong lập trình c' class='hover-show-link replace-link-1748'>ngôn ngữ lập trình c , nhưng có một loại dữ liệu khác gọi là cấu trúc (structure) cho phép bạn kết hợp các dữ liệu khác kiểu nhau. Trên thực tế, cấu trúc cho phép bạn biểu diễn một bản ghi, ví dụ như thông tin về một quyển sách trong một thư viện.
Khi lưu trữ thông tin về một quyển sách, bạn có thể sử dụng cấu trúc để lưu trữ các thuộc tính như tiêu đề, tác giả, chủ đề và ID.
Định nghĩa một cấu trúc trong C
Để định nghĩa một cấu trúc trong C, bạn sử dụng từ khóa "struct". Cú pháp của câu lệnh struct như sau:
struct [ten_cau_truc] { phan dinh nghia thanh vien cau truc; phan dinh nghia thanh vien cau truc; ... phan dinh nghia thanh vien cau truc; } [mot hoac nhieu bien cau truc];
Tên_cấu_trúc có thể tùy chọn và các thành viên cấu trúc có thể là các biến thông thường như int i, float j hoặc một định nghĩa biến khác. Cuối cùng, bạn có thể khai báo một hoặc nhiều biến cấu trúc (tùy chọn). Dưới đây là một ví dụ về khai báo biến cấu trúc Book:
struct Books { char tieude[50]; char tacgia[50]; char chude[100]; int id; } book;
Truy cập các thành phần của cấu trúc trong C
Để truy cập bất kỳ thành phần nào của cấu trúc, bạn sử dụng toán tử "toán tử truy cập phần tử". Dưới đây là ví dụ về cách sử dụng cấu trúc:
#include #include struct Books { char tieude[50]; char tacgia[50]; char chude[100]; int id; }; int main() { struct Books Book1; /* Khai báo Book1 là một biến kiểu Book */ struct Books Book2; /* Khai báo Book2 là một biến kiểu Book */ /* Thông tin chi tiết của quyển sách thứ nhất */ strcpy(Book1.tieude, "Lập trình C"); strcpy(Book1.tacgia, "Phạm Văn A"); strcpy(Book1.chude, "Ngôn ngữ lập trình C"); Book1.id = 1234567; /* Thông tin chi tiết của quyển sách thứ hai */ strcpy(Book2.tieude, "Tôi thấy hoa vàng trên cỏ xanh"); strcpy(Book2.tacgia, "Nguyễn Nhật Ánh"); strcpy(Book2.chude, "Văn học"); Book2.id = 6677028; /* Hiển thị thông tin Book1 */ printf("Tiêu đề của Book1 là: %s\n", Book1.tieude); printf("Tác giả của Book1 là: %s\n", Book1.tacgia); printf("Chủ đề của Book1 là: %s\n", Book1.chude); printf("ID của Book1 là: %d\n", Book1.id); /* Hiển thị thông tin Book2 */ printf("Tiêu đề của Book2 là: %s\n", Book2.tieude); printf("Tác giả của Book2 là: %s\n", Book2.tacgia); printf("Chủ đề của Book2 là: %s\n", Book2.chude); printf("ID của Book2 là: %d\n", Book2.id); printf("\n===========================\n"); printf("Hoclaptrinh chúc các bạn học tốt! \n"); return 0; }
Ví dụ truy cập thành phần trong cấu trúc
Cấu trúc như tham số của hàm
Bạn có thể sử dụng cấu trúc như một tham số của hàm, tương tự như các biến khác hoặc con trỏ. Để truy cập biến cấu trúc, bạn có thể sử dụng ví dụ dưới đây:
#include #include struct Books { char tieude[50]; char tacgia[50]; char chude[100]; int id; }; /* Khai báo hàm */ void inthongtinsach(struct Books book); int main() { struct Books Book1; /* Khai báo Book1 là một biến kiểu Book */ struct Books Book2; /* Khai báo Book2 là một biến kiểu Book */ /* Thông tin chi tiết của quyển sách thứ nhất */ strcpy(Book1.tieude, "Lập trình C"); strcpy(Book1.tacgia, "Phạm Văn A"); strcpy(Book1.chude, "Ngôn ngữ lập trình C"); Book1.id = 1234567; /* Thông tin chi tiết của quyển sách thứ hai */ strcpy(Book2.tieude, "Tôi thấy hoa vàng trên cỏ xanh"); strcpy(Book2.tacgia, "Nguyễn Nhật Ánh"); strcpy(Book2.chude, "Văn học"); Book2.id = 6677028; /* Hiển thị thông tin Book1 bằng cách truyền địa chỉ của Book1 */ inthongtinsach(&Book1); /* Hiển thị thông tin Book2 bằng cách truyền địa chỉ của Book2 */ inthongtinsach(&Book2); printf("\n===========================\n"); printf("Hoclaptrinh chúc các bạn học tốt! \n"); return 0; } void inthongtinsach(struct Books *book) { printf("Tiêu đề sách: %s\n", book->tieude); printf("Tác giả: %s\n", book->tacgia); printf("Chủ đề: %s\n", book->chude); printf("Book ID: %d\n", book->id); }
Ví dụ cấu trúc như tham số của hàm
Con trỏ tới cấu trúc
Bạn có thể định nghĩa con trỏ cấu trúc giống như bạn định nghĩa các loại con trỏ khác như sau:
struct Books *struct_pointer;
Bây giờ bạn có thể lưu địa chỉ của biến cấu trúc trong biến con trỏ được định nghĩa ở trên. Để tìm địa chỉ của một biến cấu trúc, đặt toán tử & trước tên cấu trúc như sau:
struct_pointer = &Book1;
Để truy cập vào thành phần của một cấu trúc sử dụng con trỏ tới cấu trúc đó, bạn sử dụng toán tử -> như sau:
struct_pointer->tieude;
Dưới đây là cách viết lại ví dụ trên sử dụng con trỏ cấu trúc:
#include #include struct Books { char tieude[50]; char tacgia[50]; char chude[100]; int id; }; /* Khai báo hàm */ void inthongtinsach(struct Books *book); int main() { struct Books Book1; /* Khai báo Book1 là một biến kiểu Book */ struct Books Book2; /* Khai báo Book2 là một biến kiểu Book */ /* Thông tin chi tiết của quyển sách thứ nhất */ strcpy(Book1.tieude, "Lập trình C"); strcpy(Book1.tacgia, "Phạm Văn A"); strcpy(Book1.chude, "Ngôn ngữ lập trình C"); Book1.id = 1234567; /* Thông tin chi tiết của quyển sách thứ hai */ strcpy(Book2.tieude, "Tôi thấy hoa vàng trên cỏ xanh"); strcpy(Book2.tacgia, "Nguyễn Nhật Ánh"); strcpy(Book2.chude, "Văn học"); Book2.id = 6677028; /* In thông tin Book1 bằng cách truyền địa chỉ của Book1 */ inthongtinsach(&Book1); /* In thông tin Book2 bằng cách truyền địa chỉ của Book2 */ inthongtinsach(&Book2); printf("\n===========================\n"); printf("Hoclaptrinh chúc các bạn học tốt! \n"); return 0; } void inthongtinsach(struct Books *book) { printf("Tiêu đề sách: %s\n", book->tieude); printf("Tác giả: %s\n", book->tacgia); printf("Chủ đề: %s\n", book->chude); printf("Book ID: %d\n", book->id); }
Ví dụ con trỏ tới cấu trúc
Các trường bit (Bit Fields) trong C
Các trường bit cho phép bạn đóng gói dữ liệu trong một cấu trúc và giúp tối ưu hóa bộ nhớ. Trong C, bạn có thể thực hiện điều này trong một định nghĩa cấu trúc bằng cách đặt độ dài bit sau biến. Dưới đây là một ví dụ:
struct packed_struct { unsigned int f1:1; unsigned int f2:1; unsigned int f3:1; unsigned int f4:1; unsigned int type:4; unsigned int my_int:9; } pack;
Ở đây, packed_struct chứa 6 phần tử: 4 phần tử f1..f4 là 1 bit, một type là 4 bit và một my_int là 9 bit.
C tự động đóng gói các trường bit trên càng gọn càng tốt, miễn là chiều dài tối đa của trường này nhỏ hơn hoặc bằng với chiều dài từ nguyên của máy tính.