Truyền mảng vào hàm
Thuộc phần Logic và luồng điều khiển trong hành trình C của Coddy. Bài học 29 trên 63.
Khi bạn truyền một mảng vào hàm trong C, một điều thú vị sẽ xảy ra ở hậu trường. Bản thân mảng không thực sự được sao chép vào hàm. Thay vào đó, thứ được truyền vào là một con trỏ đến phần tử đầu tiên của mảng.
Điều này có nghĩa là khi bạn viết tham số hàm như int arr[] hoặc int *arr, cả hai đều tương đương: chúng đều đại diện cho một con trỏ đến phần tử đầu tiên của mảng. Hàm nhận địa chỉ bộ nhớ nơi mảng bắt đầu, nhờ đó có thể truy cập trực tiếp vào dữ liệu của mảng gốc.
void printArray(int arr[], int size) {
// arr thực chất là con trỏ (pointer) trỏ đến phần tử (element) đầu tiên
// Hàm (function) có thể truy cập và thay đổi mảng (array) ban đầu
}Vì hàm (function) làm việc với vị trí bộ nhớ của mảng gốc thay vì một bản sao, mọi thay đổi bên trong hàm đều ảnh hưởng đến mảng gốc. Điều này khác với việc truyền từng biến riêng lẻ, vì cách đó tạo ra các bản sao.
Bạn cũng sẽ nhận thấy mình cần truyền kích thước của mảng dưới dạng tham số riêng, vì hàm không thể xác định độ dài của mảng chỉ từ con trỏ.
Thử thách
DễViết một chương trình C minh họa cách truyền mảng vào hàm bằng cách tạo một hàm xử lý dữ liệu nhiệt độ. Chương trình của bạn cần:
- Tạo một hàm có tên
analyzeTemperatures, nhận một mảng số nguyên và kích thước của mảng làm tham số - Bên trong hàm
analyzeTemperatures, tính và in nhiệt độ trung bình với chính xác 1 chữ số thập phân theo định dạng:Average temperature: [value] - Bên trong hàm
analyzeTemperatures, tìm và in nhiệt độ cao nhất theo định dạng:Highest temperature: [value] - Bên trong hàm
analyzeTemperatures, đếm số nhiệt độ trên 25 độ và in số lượng theo định dạng:Days above 25 degrees: [count] - Trong hàm
main, đọc một số nguyênnbiểu thị số lần đọc nhiệt độ - Đọc
ngiá trị nhiệt độ và lưu chúng vào một mảng số nguyên - Gọi hàm
analyzeTemperatures, truyền mảng và kích thước của mảng vào hàm
Chương trình cần xử lý dữ liệu nhiệt độ và hiển thị kết quả phân tích. Ví dụ, nếu đầu vào là:
5
20 28 15 32 26Đầu ra của bạn sẽ là:
Average temperature: 24.2
Highest temperature: 32
Days above 25 degrees: 3Thử thách này minh họa cách truyền mảng vào hàm dưới dạng con trỏ đến phần tử đầu tiên, nhờ đó hàm có thể truy cập và xử lý tất cả phần tử của mảng gốc mà không cần tạo bản sao.
Tự làm thử
#include <stdio.h>
// TODO: Tạo hàm analyzeTemperatures tại đây
int main() {
// Đọc số lượng giá trị nhiệt độ
int n;
scanf("%d", &n);
// Khai báo mảng để lưu các giá trị nhiệt độ
int temperatures[n];
// Đọc các giá trị nhiệt độ
for (int i = 0; i < n; i++) {
scanf("%d", &temperatures[i]);
}
// TODO: Gọi hàm analyzeTemperatures tại đây
return 0;
}Bài học này có một bài trắc nghiệm ngắn. Bắt đầu bài học để trả lời và theo dõi tiến độ.
Tất cả bài học trong Logic và luồng điều khiển
1Nền tảng về con trỏ
Con trỏ là gì?Khai báo con trỏToán tử lấy địa chỉ (&)Toán tử giải tham chiếu (*)Con trỏ NULLÔn tập: kiến thức cơ bản về con trỏ4Dự án: Công cụ xử lý văn bản đơn giản
Tổng quan dự ánĐếm ký tự2Con trỏ và mảng
Tên mảng dưới dạng con trỏPhần tử mảng và con trỏPhép toán con trỏSo sánh con trỏÔn tập: duyệt mảng bằng con trỏ5Con trỏ và hàm
Truyền theo giá trịTruyền con trỏ vào hàmSửa đổi biến qua con trỏVí dụ kinh điển: hoán đổiTruyền mảng vào hàmÔn tập: đối số con trỏ hàm3Mảng ký tự và chuỗi
Chuỗi dưới dạng mảng charKý tự kết thúc nullNhập chuỗi bằng scanfDùng strlen()Dùng strcpy()Dùng strcat()Dùng strcmp()Ôn tập: các hàm xử lý chuỗi cơ bản6Quản lý bộ nhớ
Bộ nhớ ngăn xếp và bộ nhớ heapCấp phát động với malloc()Dùng sizeof() để cấp phátKiểm tra lỗi cấp phátGiải phóng bộ nhớ với free()Cấp phát với calloc()Ôn tập: Mảng động9Dự án: Nhập thông tin liên hệ đơn giản
Định nghĩa struct ContactHàm tạo liên hệTự luyện tập: Trình biên dịch C online