Câu trả lời:
Nó cho phép bạn truyền mảng cho một hàm theo giá trị hoặc lấy nó trả về theo giá trị từ một hàm.
Các cấu trúc có thể được truyền theo giá trị, không giống như các mảng phân rã thành một con trỏ trong các bối cảnh này.
Một ưu điểm khác là nó trừu tượng hóa kích thước để bạn không phải sử dụng [MAX]
toàn bộ mã của mình bất cứ nơi nào bạn khai báo một đối tượng như vậy. Điều này cũng có thể đạt được với
typedef char ABC[MAX];
nhưng sau đó bạn có một vấn đề lớn hơn nhiều: bạn phải lưu ý rằng đó ABC
là một kiểu mảng (mặc dù bạn không thể thấy điều này khi bạn khai báo các biến kiểu ABC
) nếu không bạn sẽ bị choáng bởi thực tế điều đó ABC
có nghĩa khác trong một danh sách đối số chức năng so với trong một khai báo / định nghĩa biến.
Một lợi thế nữa là struct cho phép bạn sau đó thêm nhiều phần tử hơn nếu bạn cần, mà không phải viết lại nhiều mã.
Bạn có thể sao chép một cấu trúc và trả về một cấu trúc từ một chức năng.
Bạn không thể làm điều đó với một mảng - trừ khi nó là một phần của cấu trúc!
Bạn có thể sao chép nó như thế này.
struct ABC a, b;
........
a = b;
Đối với một mảng, bạn sẽ cần sử dụng hàm memcpy hoặc một vòng lặp để gán từng phần tử.
Bạn có thể sử dụng struct để tạo một loại dữ liệu mới như chuỗi . bạn có thể định nghĩa:
struct String {
char Char[MAX];
};
hoặc bạn có thể tạo Danh sách dữ liệu mà bạn có thể sử dụng theo đối số của hàm hoặc trả về trong phương thức của mình. Cấu trúc linh hoạt hơn một mảng, bởi vì nó có thể hỗ trợ một số toán tử như = và bạn có thể định nghĩa một số phương thức trong nó.
Hy vọng nó hữu ích cho bạn :)
Một ưu điểm khác của việc sử dụng như vậy struct
là nó thực thi an toàn kiểu bất cứ nơi nào struct
sử dụng như vậy ; đặc biệt nếu bạn có hai loại bao gồm các mảng có cùng kích thước được sử dụng cho các mục đích khác nhau, những loại này sẽ giúp bạn tránh vô tình sử dụng một mảng không phù hợp.
Nếu bạn không bao bọc một mảng trong một struct
, bạn vẫn có thể khai báo một mảng typedef
cho nó: điều này có một số ưu điểm của struct
- • loại được khai báo một lần, • kích thước được tự động sửa, • ý định của mã trở nên rõ ràng hơn, • và mã có thể duy trì nhiều hơn - nhưng bạn mất loại an toàn nghiêm ngặt, ability khả năng sao chép và trả về các giá trị của loại và ◦ khả năng thêm thành viên sau mà không phá vỡ phần còn lại của mã. Hai typedef
s cho các mảng trần của một loại nhất định chỉ mang lại các loại khác nhau nếu chúng có kích thước khác nhau. Hơn nữa, nếu bạn sử dụng typedef
mà không có *
trong một đối số chức năng, thì nó tương đương với char *
, làm giảm đáng kể sự an toàn kiểu.
Tóm lại :
typedef struct A_s_s { char m[113]; } A_s_t; // Full type safey, assignable
typedef char A_c_t[113]; // Partial type-safety, not assignable
A_s_t v_s(void); // Allowed
A_c_t v_c(void); // Forbidden
void s__v(A_s_t); // Type-safe, pass by value
void sP_v(A_s_t *); // Type-safe
void c__v(A_c_t); // UNSAFE, just means char * (GRRR!)
void cP_v(A_c_t *); // SEMI-safe, accepts any array of 113
Một cấu trúc có thể chứa các hàm khởi tạo mảng, sao chép và các hàm fini mô phỏng một số ưu điểm của mô hình quản lý bộ nhớ OOP. Trên thực tế, thật dễ dàng để mở rộng khái niệm này để viết một tiện ích quản lý bộ nhớ chung (bằng cách sử dụng cấu trúc sizeof () để biết chính xác có bao nhiêu byte đang được quản lý) để quản lý bất kỳ cấu trúc nào do người dùng xác định. Nhiều cơ sở mã sản xuất thông minh được viết bằng C sử dụng rất nhiều và thường không bao giờ sử dụng một mảng trừ khi phạm vi của nó rất cục bộ.
Trong thực tế đối với một mảng được nhúng trong một cấu trúc, bạn có thể thực hiện các "điều thông minh" khác như kiểm tra ràng buộc bất cứ lúc nào bạn muốn truy cập vào mảng này. Một lần nữa, trừ khi phạm vi mảng rất hạn chế, việc sử dụng nó và chuyển thông tin qua các chương trình là một ý tưởng tồi. Sớm hay muộn, bạn sẽ gặp phải những con bọ khiến bạn tỉnh táo vào ban đêm và làm hỏng những ngày cuối tuần của bạn.
struct
chứa một mảng.