Các phần tử của mảng có thể thuộc bất kỳ kiểu dữ liệu nào, kể cả mảng! Một mảng của mảng được gọi là mảng nhiều chiều.

int array[3][5]; // a 3-element array of 5-element arrays

Vì chúng ta có 2 chỉ số con, đây là một mảng hai chiều.

Trong mảng hai chiều, thật tiện lợi khi coi chỉ số con đầu tiên (bên trái) là hàng và chỉ số con thứ hai (bên phải) là cột. Đây được gọi là thứ tự hàng-chính. Về mặt khái niệm, mảng hai chiều ở trên được trình bày như sau:

[0] [0] [0] [1] [0] [2] [0] [3] [0] [4] // hàng 0

[1] [0] [1] [1] [1] [2] [1] [3] [1] [4] // hàng 1

[2] [0] [2] [1] [2] [2] [2] [3] [2] [4] // hàng 2

Để truy cập các phần tử của mảng hai chiều, chỉ cần sử dụng hai chỉ số con:

array[2][3] = 7;

1. Khởi tạo mảng hai chiều

Để khởi tạo mảng hai chiều, cách dễ nhất là sử dụng dấu ngoặc nhọn lồng nhau, với mỗi bộ số đại diện cho một hàng:

int array[3][5]
{
  { 1, 2, 3, 4, 5 }, // row 0
  { 6, 7, 8, 9, 10 }, // row 1
  { 11, 12, 13, 14, 15 } // row 2
};

Mặc dù một số trình biên dịch sẽ cho phép bạn bỏ qua các dấu ngoặc nhọn bên trong, chúng tôi thực sự khuyên bạn nên đưa chúng vào, vì mục đích dễ đọc và vì cách mà C ++ sẽ thay thế các bộ khởi tạo bị thiếu bằng 0.

int array[3][5]
{
  { 1, 2 }, // row 0 = 1, 2, 0, 0, 0
  { 6, 7, 8 }, // row 1 = 6, 7, 8, 0, 0
  { 11, 12, 13, 14 } // row 2 = 11, 12, 13, 14, 0
};

Mảng hai chiều có danh sách trình khởi tạo có thể bỏ qua (chỉ) thông số độ dài ngoài cùng bên trái:

int array[][5]
{
  { 1, 2, 3, 4, 5 },
  { 6, 7, 8, 9, 10 },
  { 11, 12, 13, 14, 15 }
};

Trình biên dịch có thể thực hiện phép toán để tìm ra độ dài mảng là bao nhiêu. Tuy nhiên, những điều sau đây không được phép:

int array[][] 
{
  { 1, 2, 3, 4 },
  { 5, 6, 7, 8 }
};

Cũng giống như các mảng bình thường, mảng nhiều chiều vẫn có thể được khởi tạo bằng 0 như sau:

int array[3][5]{};

2. Truy cập các phần tử trong mảng hai chiều

Việc truy cập tất cả các phần tử của mảng hai chiều yêu cầu hai vòng lặp: một cho hàng và một cho cột. Vì mảng hai chiều thường được truy cập theo từng hàng, nên chỉ mục hàng thường được sử dụng làm vòng lặp ngoài.

Trong C ++ 11, vòng lặp for-each cũng có thể được sử dụng với các mảng nhiều chiều. Chúng tôi sẽ trình bày chi tiết cho từng vòng sau.

3. Mảng nhiều hơn hai chiều

Mảng nhiều chiều có thể lớn hơn hai chiều. Đây là một khai báo của một mảng ba chiều:

for (int row{ 0 }; row < numRows; ++row) // step through the rows in the array
{
    for (int col{ 0 }; col < numCols; ++col) // step through each element in the row
    {
        std::cout << array[row][col];
    }
}

Mảng ba chiều khó khởi tạo theo bất kỳ loại trực quan nào bằng cách sử dụng danh sách trình khởi tạo, vì vậy tốt hơn hết là khởi tạo mảng bằng 0 và gán giá trị rõ ràng bằng cách sử dụng các vòng lặp lồng nhau.

Việc truy cập phần tử của mảng ba chiều tương tự như trường hợp hai chiều:

int array[5][4][3];

Ví dụ về mảng hai chiều

Hãy xem một ví dụ thực tế về mảng hai chiều:

std::cout << array[3][1][2];

Chương trình này tính toán và in một bảng cửu chương cho tất cả các giá trị từ 1 đến 9 (bao gồm cả). Lưu ý rằng khi in bảng, các vòng lặp for bắt đầu từ 1 thay vì 0. Điều này để bỏ qua việc in cột 0 và hàng 0, sẽ chỉ là một loạt các số 0! Đây là đầu ra:

1 2 3 4 5 6 7 8 9

2 4 6 8 10 12 14 16 18

3 6 9 12 15 18 21 24 27

4 8 12 16 20 24 28 32 36

5 10 15 20 25 30 35 40 45

6 12 18 24 30 36 42 48 54

7 14 21 28 35 42 49 56 63

8 16 24 32 40 48 56 64 72

9 18 27 36 45 54 63 72 81

Mảng hai chiều thường được sử dụng trong trò chơi dựa trên ô, trong đó mỗi phần tử mảng đại diện cho một ô. Chúng cũng được sử dụng trong đồ họa máy tính 3d (dưới dạng ma trận) để xoay, chia tỷ lệ và phản ánh hình dạng.

Cài ứng dụng cafedev để dễ dàng cập nhật tin và học lập trình mọi lúc mọi nơi tại đây.

Nguồn và Tài liệu tiếng anh tham khảo:

Tài liệu từ cafedev:

Nếu bạn thấy hay và hữu ích, bạn có thể tham gia các kênh sau của cafedev để nhận được nhiều hơn nữa:

Chào thân ái và quyết thắng!

Đăng ký kênh youtube để ủng hộ Cafedev nha các bạn, Thanks you!