2010-07-22 46 views

Trả lời

22

Với một mảng N-chiều (N> 0), bạn cần xác định kích thước của N-1 kích thước; chỉ một kích thước có thể được để lại cho trình biên dịch để xác định, và nó phải là kích thước đầu tiên.

Bạn có thể viết:

int d1[] = { ... }; 
int d2[][2] = { ... }; 
int d3[][2][3] = { ... }; 

vv

+1

Xin lỗi vì số 13 không may mắn, nhưng tôi thấy điều này cực kỳ hữu ích :) –

1

Bạn phải cho biết ít nhất tất cả các thứ nguyên ngoại trừ kích thước lớn nhất.

tức là trong trường hợp của bạn

int array[][3] = { 
    {1,2,3}, 
    {4,5,6}}; 
+0

không hoàn toàn đúng, bạn cần phải xác định tất cả nhưng ngoài cùng, phải không? – falstro

+0

Đúng bạn cần kích thước nhỏ nhất n-1. –

3

Bạn cần phải xác định tất cả các kích thước ngoại trừ cao nhất. Lý do là trình biên dịch sẽ phân bổ một khối bộ nhớ lớn, trái ngược với một mảng con trỏ trỏ đến các mảng nhỏ của riêng chúng. Nói cách khác,

int array[][3][4] = ...; 

sẽ cấp phát một vùng bộ nhớ tiếp giáp có kích thước 3 * 4 * (tuy nhiên nhiều mảng 3x4 bạn khai báo ở đây). Vì vậy khi sau này trong mã của bạn, bạn viết

array[1][2][3] = 69; 

để tìm ra nơi trong bộ nhớ để viết 69, nó bắt đầu tại địa chỉ (mảng), sau đó nhảy về phía trước 12 * sizeof (int) để có được mảng [ 1], cộng với 2 * 4 * sizeof (int) để đến mảng [1] [2], cộng với 3 * sizeof (int) để cuối cùng nhận được để bắt đầu mảng [1] [2] [3]. So sánh điều này với văn bản, ví dụ:

int ***array = new int**[n]; 
for(i=0; i<n; i++) 
{ 
    array[i] = new int * [3]; 
    for(j=0; j<4; j++) 
    array[i][j] = new int[4]; 
} 

(xin lỗi nếu cú ​​pháp của tôi không chính xác ... được một thời gian kể từ khi tôi phải viết mã như thế này trong C). Trong ví dụ này, mảng trỏ đến một khối mã n * sizeof (int **) byte dài. Mỗi phần tử của mảng này trỏ tới một mảng khác có kích thước 3 * sizeof (int *) byte dài. Mỗi phần tử của các mảng này trỏ tới một mảng khác có kích thước 4 * sizeof (int) byte dài. Trong trường hợp này, thay vì tính toán mảng [1] [2] [3] là tại địa chỉ (mảng + cái gì đó), nó sẽ cần phải làm theo một vài con trỏ khác nhau trong bộ nhớ trước khi tìm nơi viết 69.

Các vấn đề liên quan