Mảng trong C cho phép xác định loại biến có thể chứa nhiều mục dữ liệu cùng loại, còn cấu trúc (Struct) trong C tương tự là một kiểu dữ liệu do người dùng định nghĩa khác có sẵn trong C cho phép kết hợp các mục dữ liệu của các loại khác nhau.
Các cấu trúc được sử dụng để biểu diễn một bản ghi. Giả sử bạn muốn theo dõi sách của mình trong thư viện. Bạn có thể muốn theo dõi các thuộc tính sau đây về mỗi cuốn sách:
Tiêu đề
Tác giả
Chủ đề
ID sách
Để xác định một cấu trúc, bạn phải sử dụng câu lệnh struct. Câu lệnh struct định nghĩa một kiểu dữ liệu mới, với nhiều hơn một phần tử. Định dạng của câu lệnh struct như sau:
struct [structure tag] {
member definition;
member definition;
...
member definition;
} [one or more structure variables];
Các thẻ cấu trúc là tùy chọn và mỗi phần tử là một định nghĩa biến bình thường, chẳng hạn như int i; hoặc float f hoặc bất kỳ định nghĩa biến hợp lệ nào khác. Khi kết thúc định nghĩa của cấu trúc, trước dấu chấm phẩy cuối cùng, bạn có thể chỉ định một hoặc nhiều biến cấu trúc tùy chọn.
struct Books {
char title[50];
char author[50];
char subject[100];
int book_id;
} book;
Để truy cập bất kỳ thành phần nào của cấu trúc, chúng tôi sử dụng toán tử truy cập thành phần (.) . Toán tử truy cập thành phần được mã hóa một khoảng thời gian giữa tên biến cấu trúc và thành phần cấu trúc mà chúng ta muốn truy cập. Bạn sẽ sử dụng cấu trúc từ khóa để xác định các biến của kiểu cấu trúc. Ví dụ sau đây cho thấy cách sử dụng cấu trúc trong chương trình C:
#include
#include
struct Books {
char title[50];
char author[50];
char subject[100];
int book_id;
};
int main( ) {
struct Books Book1; /* Declare Book1 of type Book */
struct Books Book2; /* Declare Book2 of type Book */
/* book 1 specification */
strcpy( Book1.title, "C Programming");
strcpy( Book1.author, "Nuha Ali");
strcpy( Book1.subject, "C Programming Tutorial");
Book1.book_id = 6495407;
/* book 2 specification */
strcpy( Book2.title, "Telecom Billing");
strcpy( Book2.author, "Zara Ali");
strcpy( Book2.subject, "Telecom Billing Tutorial");
Book2.book_id = 6495700;
/* print Book1 info */
printf( "Book 1 title : %s\n", Book1.title);
printf( "Book 1 author : %s\n", Book1.author);
printf( "Book 1 subject : %s\n", Book1.subject);
printf( "Book 1 book_id : %d\n", Book1.book_id);
/* print Book2 info */
printf( "Book 2 title : %s\n", Book2.title);
printf( "Book 2 author : %s\n", Book2.author);
printf( "Book 2 subject : %s\n", Book2.subject);
printf( "Book 2 book_id : %d\n", Book2.book_id);
return 0;
}
Khi mã trên được biên dịch và thực hiện, nó tạo ra kết quả sau:
Book 1 title : C Programming
Book 1 author : Nuha Ali
Book 1 subject : C Programming Tutorial
Book 1 book_id : 6495407
Book 2 title : Telecom Billing
Book 2 author : Zara Ali
Book 2 subject : Telecom Billing Tutorial
Book 2 book_id : 6495700
Bạn có thể chuyển một cấu trúc như một đối số hàm theo cách tương tự khi bạn chuyển bất kỳ biến hoặc con trỏ nào khác.
#include
#include
struct Books {
char title[50];
char author[50];
char subject[100];
int book_id;
};
/* function declaration */
void printBook( struct Books book );
int main( ) {
struct Books Book1; /* Declare Book1 of type Book */
struct Books Book2; /* Declare Book2 of type Book */
/* book 1 specification */
strcpy( Book1.title, "C Programming");
strcpy( Book1.author, "Nuha Ali");
strcpy( Book1.subject, "C Programming Tutorial");
Book1.book_id = 6495407;
/* book 2 specification */
strcpy( Book2.title, "Telecom Billing");
strcpy( Book2.author, "Zara Ali");
strcpy( Book2.subject, "Telecom Billing Tutorial");
Book2.book_id = 6495700;
/* print Book1 info */
printBook( Book1 );
/* Print Book2 info */
printBook( Book2 );
return 0;
}
void printBook( struct Books book ) {
printf( "Book title : %s\n", book.title);
printf( "Book author : %s\n", book.author);
printf( "Book subject : %s\n", book.subject);
printf( "Book book_id : %d\n", book.book_id);
}
Khi mã trên được biên dịch và thực hiện, nó tạo ra kết quả sau:
Book title : C Programming
Book author : Nuha Ali
Book subject : C Programming Tutorial
Book book_id : 6495407
Book title : Telecom Billing
Book author : Zara Ali
Book subject : Telecom Billing Tutorial
Book book_id : 6495700
Bạn có thể định nghĩa các con trỏ tới các cấu trúc theo cách tương tự như bạn định nghĩa con trỏ tới bất kỳ biến nào khác:
struct Books *struct_pointer;
Bây giờ, bạn có thể lưu trữ địa chỉ của một biến cấu trúc trong biến con trỏ được xác định ở trên. Để tìm địa chỉ của biến cấu trúc, hãy đặt '&'; toán tử trước tên của cấu trúc như sau:
struct_pointer = &Book1;
Để truy cập các thành phần của một cấu trúc bằng cách sử dụng một con trỏ đến cấu trúc đó, bạn phải sử dụng toán tử → như sau:
struct_pointer->title;
Chúng ta hãy viết lại ví dụ trên bằng cách sử dụng con trỏ cấu trúc:
#include
#include
struct Books {
char title[50];
char author[50];
char subject[100];
int book_id;
};
/* function declaration */
void printBook( struct Books *book );
int main( ) {
struct Books Book1; /* Declare Book1 of type Book */
struct Books Book2; /* Declare Book2 of type Book */
/* book 1 specification */
strcpy( Book1.title, "C Programming");
strcpy( Book1.author, "Nuha Ali");
strcpy( Book1.subject, "C Programming Tutorial");
Book1.book_id = 6495407;
/* book 2 specification */
strcpy( Book2.title, "Telecom Billing");
strcpy( Book2.author, "Zara Ali");
strcpy( Book2.subject, "Telecom Billing Tutorial");
Book2.book_id = 6495700;
/* print Book1 info by passing address of Book1 */
printBook( &Book1 );
/* print Book2 info by passing address of Book2 */
printBook( &Book2 );
return 0;
}
void printBook( struct Books *book ) {
printf( "Book title : %s\n", book->title);
printf( "Book author : %s\n", book->author);
printf( "Book subject : %s\n", book->subject);
printf( "Book book_id : %d\n", book->book_id);
}
Khi mã trên được biên dịch và thực hiện, nó tạo ra kết quả sau:
Book title : C Programming
Book author : Nuha Ali
Book subject : C Programming Tutorial
Book book_id : 6495407
Book title : Telecom Billing
Book author : Zara Ali
Book subject : Telecom Billing Tutorial
Book book_id : 6495700
Bit Fields cho phép đóng gói dữ liệu trong một cấu trúc, điều này đặc biệt hữu ích khi bộ nhớ hoặc lưu trữ dữ liệu ở mức cao nhất.
C cho phép chúng ta làm điều này trong một định nghĩa cấu trúc bằng cách đặt: chiều dài bit sau biến. 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, bundle_struct chứa 6 thành viên: Bốn cờ 1 bit f1..f3, kiểu 4 bit và my_int 9 bit.
C tự động đóng gói các trường bit ở trên càng nhỏ càng tốt, với điều kiện độ dài tối đa của trường nhỏ hơn hoặc bằng độ dài từ nguyên của máy tính. Nếu đây không phải là trường hợp, sau đó một số trình biên dịch có thể cho phép chồng chéo bộ nhớ cho các trường trong khi các trình biên dịch khác sẽ lưu trữ trường tiếp theo trong từ tiếp theo.
Tìm hiểu thêm về kiến thức C: