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 !
Bài liên quan
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ế.
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 ?
đị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]
Trong clip anh Đạt có đề cập đến việc khai báo mảng 3 chiều :
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
Đầ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
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} } }
Chuẩn rồi đó
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ềnint a2[][3]
thì a2 là con trỏ trỏ tới mảng chứa 3 số nguyên.edit:
int a1[][]
ko được, lỗideclaration 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.
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
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ì
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.