Menu
CoddyTech

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ỏ.

challenge icon

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:

  1. 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ố
  2. 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]
  3. Bên trong hàm analyzeTemperatures, tìm và in nhiệt độ cao nhất theo định dạng: Highest temperature: [value]
  4. 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]
  5. Trong hàm main, đọc một số nguyên n biểu thị số lần đọc nhiệt độ
  6. Đọc n giá trị nhiệt độ và lưu chúng vào một mảng số nguyên
  7. 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: 3

Thử 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;
}
quiz iconTự kiểm tra

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

Tự luyện tập: Trình biên dịch C online