Xem thêm

Bài 8: Tận dụng mảng trong tham số hàm để tính toán hiệu quả hơn

Huy Erick
Mảng có thể được sử dụng làm tham số trong các hàm tính toán. Có nhiều cách để truyền mảng vào hàm, bao gồm: sử dụng mảng có kích cỡ, sử dụng mảng không có...

Mảng có thể được sử dụng làm tham số trong các hàm tính toán. Có nhiều cách để truyền mảng vào hàm, bao gồm: sử dụng mảng có kích cỡ, sử dụng mảng không có kích cỡ và sử dụng con trỏ. Trong bài viết này, chúng ta sẽ tập trung vào hai cách đầu tiên, bỏ qua cách sử dụng con trỏ vì không cần thiết.

Cú pháp

  • Truyền mảng có kích cỡ: {Kiểu_trả_về} {Tên_hàm}({Kiểu_phần_tử} {Tên_mảng}[{Kích_cỡ}])
  • Truyền mảng không kích cỡ: {Kiểu_trả_về} {Tên_hàm}({Kiểu_phần_tử} {Tên_mảng}[])

Khác với việc truyền biến, việc truyền mảng không phân biệt giữa tham trị và tham chiếu. Khi truyền mảng, hệ thống luôn truyền trực tiếp địa chỉ của phần tử đầu tiên của mảng ban đầu vào hàm. Điều này dẫn đến mọi thay đổi trên tham số hàm sẽ tác động đến mảng gốc bên ngoài, dù là theo cách nào trong số các cách trên. Vì vậy, cần chú ý đến dữ liệu khi thực hiện truyền mảng vào hàm.

Dưới đây là ví dụ cụ thể:

#include 
using namespace std;

void increase(int b[]) {
    for (int i = 0; i <= 4; ++i)
        ++b[i];
}

int main() {
    int a[5] = {1, 2, 3, 4, 5};
    increase(a);

    cout << "Mảng sau khi tăng lên: ";
    for (int i = 0; i <= 4; ++i)
        cout << a[i] << ' ';

    return 0;
}

Kết quả khi chạy chương trình:

Mảng sau khi tăng lên: 2 3 4 5 6

Trong ví dụ trên, tham số của hàm increase(int b[]) có thể thay bằng increase(int b[5]) mà kết quả vẫn giống nhau. Điều này xảy ra vì hệ thống không tạo bản sao của mảng mà truyền trực tiếp địa chỉ của mảng gốc vào hàm.

Ngoài ra, C++ không cho phép trả về trực tiếp một mảng là kết quả của hàm. Để trả về một mảng, cần sử dụng con trỏ, nhưng điều này khá phức tạp. Thay vào đó, nên khai báo các mảng là biến toàn cục hoặc sử dụng kiểu mảng động .

Mảng hai chiều trong tham số hàm

Mảng hai chiều thực ra là một "mảng chứa các mảng". Điều này có nghĩa là mảng hai chiều giống như mảng một chiều, nhưng mỗi phần tử là một mảng một chiều khác. Trên bộ nhớ, toàn bộ các phần tử của mảng hai chiều được viết liền kề với nhau, chứ không tạo thành một bảng như chúng ta tưởng tượng.

Khi truyền mảng hai chiều vào hàm, chương trình vẫn truyền địa chỉ của phần tử đầu tiên trong mảng hai chiều. Ví dụ, với một mảng hai chiều 3x3, bạn có thể khai báo tham số hình thức theo các cách sau:

  • Cách 1: Khai báo cụ thể số hàng, số cột: void function(int a[3][3])
  • Cách 2: Khai báo cụ thể số cột, số hàng bỏ trống: void function(int a[][3])
  • Cách 3: Sử dụng từ khoá typedef để định nghĩa trước kiểu mảng: typedef int arr[100][100]; void function(arr a);

Lưu ý rằng nếu truyền mảng hai chiều trở lên, chỉ có chiều đầu tiên được phép để trống kích thước, còn các chiều sau đó phải xác định kích thước. Ví dụ, cách khai báo tham số int a[][] là không hợp lệ và sẽ báo lỗi khi biên dịch.

Để tìm hiểu thêm về mảng hai chiều trong C++, bạn có thể tham khảo các nguồn sau:

1