Menu
CoddyTech

Truyền theo giá trị

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 25 trên 63.

Khi bạn truyền một biến vào hàm trong C, hàm nhận được bản sao giá trị của biến đó, chứ không phải chính biến đó. Khái niệm cơ bản này được gọi là truyền theo giá trị (pass-by-value).

Điều xảy ra như sau: nếu bạn có một biến x mang giá trị 10 và truyền nó cho một hàm (function), hàm đó sẽ nhận một bản sao riêng của giá trị ấy. Mọi thay đổi mà hàm thực hiện trên bản sao này đều không ảnh hưởng đến biến ban đầu trong hàm gọi.

void tryToChange(int num) {
    num = 99;  // Điều này chỉ thay đổi bản sao
}

int main() {
    int x = 10;
    tryToChange(x);
    // x vẫn là 10, không phải 99
    return 0;
}

Cách hoạt động này bảo vệ dữ liệu gốc của bạn khỏi bị hàm vô tình thay đổi. Tuy nhiên, điều đó cũng có nghĩa là nếu bạn muốn một hàm thực sự thay đổi giá trị của biến, truyền theo giá trị sẽ không hiệu quả. Hiểu rõ hạn chế này rất quan trọng khi bạn tiếp tục tìm hiểu về con trỏ và cách chúng giải quyết vấn đề này.

challenge icon

Thử thách

Dễ

Hãy viết một chương trình C minh họa khái niệm truyền giá trị bằng cách thử sửa đổi một biến bên trong hàm và quan sát rằng biến ban đầu vẫn không thay đổi.

Chương trình của bạn cần:

  1. Tạo một hàm (function) có tên tryToModify, nhận tham số số nguyên tên number
  2. Bên trong hàm tryToModify, cộng 50 vào tham số number
  3. Bên trong hàm tryToModify, in giá trị đã sửa đổi theo định dạng: Inside function: [value]
  4. Trong hàm main, khai báo một biến số nguyên tên original và khởi tạo biến với giá trị 25
  5. In giá trị ban đầu trước khi gọi hàm theo định dạng: Before function call: [value]
  6. Gọi hàm tryToModify và truyền biến original làm đối số
  7. Sau khi gọi hàm, in lại giá trị của original theo định dạng: After function call: [value]

Đầu ra cần cho thấy giá trị của biến ban đầu vẫn không thay đổi dù hàm đã sửa đổi giá trị bên trong:

Before function call: 25
Inside function: 75
After function call: 25

Thử thách này minh họa khái niệm cơ bản về truyền giá trị trong C, khi các hàm nhận bản sao của biến thay vì chính các biến đó. Mọi sửa đổi đối với tham số bên trong hàm đều không ảnh hưởng đến biến ban đầu trong hàm gọi.

Tự làm thử

#include <stdio.h>

// TODO: Viết hàm (function) tryToModify tại đây

int main() {
    // TODO: Viết code tại đây
    // 1. Khai báo và khởi tạo biến ban đầu
    // 2. In ra giá trị trước khi gọi hàm
    // 3. Gọi hàm tryToModify
    // 4. In ra giá trị sau khi gọi hàm
    
    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