typedef int array [x][];
Điều đó có nghĩa là gì. Điều gì sẽ xảy ra nếu chúng ta có một typedef. Đó là câu hỏi phỏng vấn của tôi.typedef của một mảng đa chiều?
typedef int array [x][];
Điều đó có nghĩa là gì. Điều gì sẽ xảy ra nếu chúng ta có một typedef. Đó là câu hỏi phỏng vấn của tôi.typedef của một mảng đa chiều?
Bạn sẽ nhận được chẩn đoán.
int [x][]
là loại mảng không hoàn chỉnh không thể hoàn thành.
Bạn sẽ nhận được lỗi biên dịch. Đối với mảng đa chiều, tối đa thứ nguyên đầu tiên có thể bị bỏ qua. Ví dụ: int array[][x]
sẽ hợp lệ.
Giả sử bạn có một nơi nào:
#define x 3
Như những người khác chỉ ra, typedef int array [3][];
sẽ không biên dịch. Bạn chỉ có thể bỏ qua phần tử quan trọng nhất (tức là thứ nhất) của độ dài mảng.
Nhưng bạn thể nói:
typedef int array [][3];
Điều này có nghĩa rằng array
là một mảng int (có độ dài như-chưa xác định) có độ dài 3 mảng.
Để sử dụng, bạn cần chỉ định độ dài. Bạn có thể làm điều này bằng cách sử dụng một initialiser như vậy:
array A = {{1,2,3,},{4,5,6}}; // A now has the dimensions [2][3]
nhưng bạn không thể nói:
array A;
Trong trường hợp này, kích thước đầu tiên A
's không được xác định, vì vậy trình biên dịch doesn 't biết bao nhiêu không gian để phân bổ cho nó.
Lưu ý rằng nó cũng tốt để sử dụng array
loại này trong một định nghĩa chức năng - như mảng trong định nghĩa hàm luôn chuyển con trỏ đến phần tử đầu tiên của họ bởi trình biên dịch:
// these are all the same
void foo(array A);
void foo(int A[][3]);
void foo(int (*A)[3]); // this is the one the compiler will see
Lưu ý rằng trong trường hợp này:
void foo(int A[10][3]);
Trình biên dịch vẫn thấy
void foo(int (*A)[3]);
Vì vậy, phần 10
của A[10][3]
bị bỏ qua.
Nói tóm lại:
typedef int array [3][]; // incomplete type, won't compile
typedef int array [][3]; // int array (of as-yet unspecified length)
// of length 3 arrays
Để biết thêm chi tiết về phân tích cú pháp typedef: http://publications.gbdirect.co.uk/c_book/chapter8/typedef.html –