1. Truyền phần tử mảng làm tham số thực
Mỗi phần tử mảng có thể được dùng như một biểu thức, do đó hoàn toàn có thể truyền chúng vào hàm giống như biến thông thường. Cơ chế truyền là "truyền giá trị" — nghĩa là dữ liệu được sao chép, nên mọi thay đổi bên trong hàm không ảnh hưởng đến giá trị gốc bên ngoài.
2. Truyền tên mảng làm tham số
Khi truyền tên mảng, tham số hình thức trong hàm có thể khai báo dưới dạng mảng hoặc con trỏ. Lưu ý các điểm sau:
- Cả hàm gọi và hàm được gọi đều phải khai báo mảng riêng — ví dụ:
arrlà mảng hình thức,datalà mảng thực tế — mỗi bên tự định nghĩa, không được bỏ qua ở một phía. - Kiểu của mảng thực và mảng hình thức phải trùng khớp, nếu không sẽ gây lỗi không lường trước.
- Kích thước mảng hình thức (ví dụ:
[10]) không có ý nghĩa thực tế vì trình biên dịch C không kiểm tra kích thước này. Thay vào đó, chỉ địa chỉ phần tử đầu tiên của mảng thực được truyền vào. Do đó,arr[0]vàdata[0]cùng trỏ đến một ô nhớ — mọi thay đổi trong hàm sẽ ảnh hưởng trực tiếp đến mảng gốc. - Có thể bỏ qua kích thước khi khai báo mảng hình thức:
int arr[]. Nếu cần xử lý nhiều phần tử, nên thêm tham số riêng để truyền số lượng phần tử cần xử lý.
3. Truyền mảng ký tự
3.1 Mảng một chiều
Với mảng ký tự (chuỗi), không cần truyền kèm kích thước vì chuỗi luôn kết thúc bằng ký tự '\0'. Hàm có thể dựa vào dấu hiệu này để xác định điểm dừng.
Lưu ý lỗi phổ biến: Hàm sizeof() khi áp dụng cho mảng truyền vào sẽ trả về kích thước con trỏ (thường là 8 byte trên hệ 64-bit), chứ không phải kích thước mảng gốc — vì lúc này nó đang thao tác với kiểu con trỏ, không còn là mảng tĩnh ban đầu.
3.2 Mảng hai chiều
Mảng đa chiều cũng có thể truyền vào hàm. Khi khai báo tham số hình thức, bạn có thể ghi rõ kích thước từng chiều, hoặc bỏ qua chiều đầu tiên:
void process(int grid[][10]); // Hợp lệ
void process(int grid[5][10]); // Cũng hợp lệ và tương đương
Nhưng không được bỏ qua chiều thứ hai trở đi: int grid[][] là không hợp lệ.
Lưu ý: Chiều đầu tiên của mảng hình thức có thể khác với mảng thực — miễn là chiều còn lại giống nhau. Ví dụ: mảng thực int vals[5][10] vẫn có thể truyền vào hàm nhận int grid[3][10] — vì cả hai đều là tập hợp các mảng con 10 phần tử.
3.3 Mảng chuỗi
Việc truyền mảng chứa các chuỗi tuân theo quy tắc giống như mảng số nguyên hai chiều — cùng yêu cầu về cú pháp và cách xử lý bộ nhớ.
4. Gợi ý khi viết hàm
Khi gọi hàm với mảng, chỉ truyền tên mảng — không kèm chỉ số. Việc viết arr[i] sẽ truyền phần tử đơn lẻ, không phải địa chỉ mảng.
void reverseStrings(char lines[][100], int count) {
for (int i = 0; i < count / 2; ++i) {
char temp[100];
strcpy(temp, lines[count - i - 1]);
strcpy(lines[count - i - 1], lines[i]);
strcpy(lines[i], temp);
}
}
maxOfTheArray2D(matrix, rowCount);