Bài tập

Mảng Nhiều Chiều: Cải tiến kiến thức về mảng đa chiều

Huy Erick

Mảng Nhiều Chiều là gì? Bạn đã biết về mảng một chiều, đúng không? Nó chứa một tập hợp các phần tử có cùng kiểu dữ liệu. Tương tự như vậy, mảng nhiều chiều cũng...

Mảng Nhiều Chiều là gì?

Bạn đã biết về mảng một chiều, đúng không? Nó chứa một tập hợp các phần tử có cùng kiểu dữ liệu. Tương tự như vậy, mảng nhiều chiều cũng chứa nhiều phần tử, và mỗi phần tử lại là một mảng một chiều. Các mảng một chiều này có kích thước bằng nhau và có thể được truy xuất thông qua chỉ số - số thứ tự của mảng một chiều đó trong mảng nhiều chiều.

Ví dụ: Mảng 2 chiều là một mảng chứa n phần tử, trong đó mỗi phần tử là một mảng một chiều. Mảng 3 chiều sẽ chứa n phần tử, và mỗi phần tử sẽ là một mảng 2 chiều chứa m mảng một chiều.

Khi lưu trữ, mảng nhiều chiều được "chuyển đổi" thành mảng một chiều và lưu trên một vùng nhớ liên tục, tương tự như mảng một chiều.

Khai báo mảng nhiều chiều

Trong ngôn ngữ lập trình C++, chúng ta khai báo mảng nhiều chiều như sau:

kiểu_dữ_liệu tên_mảng[số_phần_tử_chiều_1][số_phần_tử_chiều_2]...[số_phần_tử_chiều_n];

Ở đây, kiểu dữ liệu, tên mảng và số phần tử chiều x có quy tắc sử dụng tương tự như mảng một chiều, nghĩa là phải là hằng số.

Ví dụ:

// Khai báo mảng 2 chiều 3 x 4 kiểu int
int a[3][4];

// Khai báo mảng 3 chiều 3 x 4 x 5 kiểu float
float a[3][4][5];

Khởi tạo giá trị phần tử của mảng nhiều chiều

Tương tự như mảng một chiều, chúng ta có thể khởi tạo giá trị cho các phần tử của mảng nhiều chiều ngay khi khai báo. Ví dụ, chúng ta có thể khai báo và khởi tạo mảng hai chiều a như sau:

int a[3][2] = {6, 4, 5, 9, 0, 7};

Hoặc có thể khởi tạo theo từng chiều để dễ quản lý:

int a[3][5] = {{1, 2, 3, 4, 5}, {6, 7, 8, 9, 0}, {4, 9, 3, 2, 5}};

Ngoài ra, chúng ta cũng có thể lược bỏ số phần tử đầu tiên:

int a[][5] = {{1, 2, 3, 4, 5}, {6, 7, 8, 9, 0}, {4, 9, 3, 2, 5}};

LƯU Ý: Chỉ được bỏ trống số phần tử đầu tiên. Nếu không, trình biên dịch sẽ không thể xác định được kích thước của mảng. Ví dụ, khai báo mảng a như sau là không hợp lệ:

int a[][] = {{1, 2, 3, 4, 5}, {6, 7, 8, 9, 0}, {4, 9, 3, 2, 5}};

Nếu khai báo như trên, mảng sẽ có tổng cộng 8 phần tử int, nhưng trình biên dịch không thể biết được mảng a là 2 x 4, 4 x 2, 1 x 8 hay 8 x 1.

Chúng ta cũng có thể khởi tạo giá trị cho mảng nhiều chiều sau khi khai báo bằng cách sử dụng vòng lặp. Mảng có bấy nhiêu chiều, chúng ta sẽ có bấy nhiêu vòng lặp lồng vào nhau:

int a[5][5];
for (i = 0; i  5; i++) {
  for (j = 0; j  5; j++) {
    a[i][j] = value;
  }
}

Truy xuất phần tử

Để truy xuất phần tử trong mảng nhiều chiều, chúng ta sử dụng chỉ số của từng "chiều". Ví dụ, để truy xuất đến phần tử thuộc hàng 2 cột 3 của mảng hai chiều a, ta sử dụng a[2][3]. Lưu ý là các chỉ số bắt đầu từ 0.

Sử dụng mảng nhiều chiều là tham số của hàm

Để khai báo hàm có mảng nhiều chiều là tham số, chúng ta có thể để trống chỉ số đầu tiên nhưng phải cung cấp các chỉ số còn lại của mảng để trình biên dịch có thể biết được kích thước của mảng đó. Ví dụ:

int a[5][5];
void doSomething(int &a[5][5]) {
  // ...
}
doSomething(a);

Hoặc:

int a[5][5];
void doSomething(int &a[][5]) {
  // ...
}
doSomething(a);

Đó là những điều cơ bản về mảng nhiều chiều mà bạn cần biết. Để tìm hiểu thêm về các vấn đề khác liên quan đến mảng, hãy đọc thêm tại bài viết "Sử Dụng Mảng Trong C++".

1