@pysyren: Bạn không nên thỏa mãn ở mức chương trình dịch/chạy được mà không hiểu tại sao.

Gửi bởi
prog10
^ Nói thật là mình chả thể hiểu sao viết int (*laymt())[100] thì ngon mà viết int*[100]... lại teo [IMG]images/smilies/smile.png[/IMG]
Thực ra thì khai báo của C/C++ khá là chuối. Việc viết int *[100] laymt() theo mình nghĩ là đúng theo suy luận logic. Đúng ra thì sẽ là int (*)[100] laymt(), với việc hiểu là laymt trả về kiểu int (*)[100], tức là con trỏ tới mảng 100 int. Điều này gần với cách dùng typedef:
Mã:
// ARRAY là kiểu mảng 100 int
typedef int ARRAY[100];
// laymt là hàm trả về con trỏ kiểu ARRAY
ARRAY *laymt();
Hoặc cũng có thể viết
Mã:
// POINTER là kiểu con trỏ tới mảng 100 int
typedef int (*POINTER)[100];
POINTER laymt();
Nhưng C/C++ không cho phép viết
Mã:
int (*)[100] laymt();
Vấn đề chỉ là do cú pháp của C/C++. Mỗi khai báo của C/C++ sẽ có hai phần: declaration-specifiers declarator (chính xác hơn sẽ là init-declarator-list, như trong int i, j, k=0). Phần declaration-specifiers sẽ bao gồm kiểu và storage-class, ví dụ như static unsigned int. Phần declarator sẽ phải có đúng một identifier (tên biến hoặc tên hàm), và đây chính là phần mà nhiều khi làm cho khai báo của C/C++ khó đọc:
Mã:
int *a[10]; // a là mảng 10 con trỏ tới int
int (*a)[10]; // a là con trỏ tới mảng 10 int
int *f(void); // f là hàm trả về con trỏ tới int
int (*f)(void); // f là con trỏ tới hàm trả về kiểu int
int (*a[10])(void); // a là mảng 10 con trỏ tới hàm trả về kiểu int
Với khai báo
Mã:
int (*)[100] laymt();
Thì declaration-specifiers là int, và phần còn lại là declarator. Nhưng phần declarator này lại không tuân theo cú pháp của C/C++. Trình biên dịch sẽ báo là thiếu identifier sau dấu *.
khi đề cập đến đội hình MU, không thể ko nói tới một trong các câu lạc bộ bóng đá huyền thoại và với tầm ảnh hưởng nhất trong lịch sử của môn thể thao vua. Với hơn 1 thế kỷ còn đó và phát triển,...
Đội hình MU - Manchester United:...