30/09/2018, 17:24

Hỏi về mảng đa chiều trong C++?

Xin chào mọi người,

Mình có tìm hiểu và xem clip hướng dẫn về mảng 2 chiều của anh Đạt trên youtube, trong clip anh Đạt có nói về khái niệm mảng 3 chiều, 4 chiều …(n chiều). Nếu như mảng 2 chiều được biểu diễn dưới dạng ma trận, thì mảng n chiều đó được biểu diễn như thế nào ? Và bản chất cũng như ứng dụng của nó ?

  • Về phần truyền mảng 2 chiều vào hàm, mình thắc mắc tại sao khi thiếu số cột thì lại báo lỗi :

void inMang2chieu(int mang2chieu[][], int hangs, int cots){ // lỗi

void inMang2chieu(int mang2chieu[][3], int hangs, int cots){ // đúng

Cảm ơn mọi người !

Nguyễn Văn Tâm viết 19:41 ngày 30/09/2018

Mảng 1 chiều cấp phát tĩnh là 1 dãy các phần tử cùng kiểu liên tiếp trong bộ nhớ. Mảng 2 chiều cũng như mảng 1 chiều, các phần tử được cấp phát hết hàng này tới hàng khác. Ví dụ như mảng int a[2][2] thì a[0] rồi đến a[1] nối tiếp nhau. Mảng nhiều chiều cũng như thế.

Hoàng Việt viết 19:25 ngày 30/09/2018

Vậy tại sao lại có khái niệm mảng nhiều chiều ? Mình nghĩ nó phải có gì khác chứ bạn ?

viết 19:30 ngày 30/09/2018

địa chỉ của bộ nhớ là 1 chiều. Vậy làm sao để biểu diễn mảng n chiều trong không gian 1 chiều?

đơn giản là xếp chúng nó sát nhau
ví dụ mảng 2x3
dòng thứ 1: [a11][a12][a13]
dòng thứ 2: [a21][a22][a23]
xếp trên bộ nhớ 1 chiều:
[a11][a12][a13][a21][a22][a23]

tương tự cho mảng 3 chiều. Mảng 2x3 trên có thể xem là mảng 3 chiều 1x2x3. Mảng 3 chiều 2x2x3 thì sẽ được xếp là:
[a111][a112][a113][a121][a122][a123][a211][a212][a213][a221][a222][a223]

Hoàng Việt viết 19:29 ngày 30/09/2018

Trong clip anh Đạt có đề cập đến việc khai báo mảng 3 chiều :

int Mang3chieu[2][3][4]

Bạn có thể xem link ở đây : C++ Bài 30 - In mảng 2 chiều ra màn hình

Cảm ơn bạn

Nguyễn Văn Tâm viết 19:38 ngày 30/09/2018

int Mang3chieu[2][3][4]

Đầu tiên có 2 phần mỗi phần lại có 3 phần nhỏ, mỗi phần nhỏ lại có 4 phần tử int. Vậy thôi

Hoàng Việt viết 19:33 ngày 30/09/2018

Vậy với mảng 3 chiều thì mình truyền dữ liệu như thế này phải ko bạn ?
int Mang3chieu[2][2][3] = { { {1, 2, 3}, {4, 5, 6} }, { {7, 8, 9}, {10, 11, 12} } }

Nguyễn Văn Tâm viết 19:33 ngày 30/09/2018

Chuẩn rồi đó

viết 19:30 ngày 30/09/2018

về phần truyền mảng vào hàm thì truyền int** a1 thì a1 là con trỏ trỏ tới con trỏ trỏ tới số nguyên. Còn truyền int a2[][3] thì a2 là con trỏ trỏ tới mảng chứa 3 số nguyên.
edit: int a1[][] ko được, lỗi declaration of 'a' as multidimensional array must have bounds for all dimensions except the first, chỉ được xài 1 cái [] vì C/C++ hiểu mảng đa chiều là con trỏ trỏ tới mảng “1” chiều…

a1 ví dụ có giá trị là x, hay trỏ tới địa chỉ x, thì a1 + 1 thực ra là x + 4, nếu sizeof(con trỏ) là 4, hoặc x + 8 nếu size của con trỏ là 8.

[pointer_1][pointer_2]...
 ^a1        ^a1+1

còn a2 ra địa chỉ y, thì a2 + 1 thực ra là y + 3*4 = y + 12, nếu sizeof int là 4, vì mảng 2 chiều được xếp liên tục

[int_11][int_12][int_13][int_21][int_22][int_23]...
 ^a2                     ^a2+1

với kiểu này thì mỗi dòng trong mảng 2 chiều a2 nằm sát nhau, còn kiểu a1 kia thì mỗi dòng nằm 1 nơi. 2 cái khác nhau.

với mảng 3 chiều 2x2x3 thì

[int_111][int_112][int_113][int_121][int_122][int_123][int_211][int_212][int_213]...
 ^a3                                                   ^a3+1

a3 + 1 thực chất là a3 + (2*3)*4. Vì vậy nên khi truyền mảng nhiều chiều nó ko cần biết chiều đầu tiên gồm bao nhiêu phần tử, mà cần biết tất cả các chiều còn lại có bao nhiêu phần tử, để a3 + 1 có thể tính ra chính xác được.

Bài liên quan
0