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.
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:
- Tạo một hàm (function) có tên
tryToModify, nhận tham số số nguyên tênnumber - Bên trong hàm
tryToModify, cộng 50 vào tham sốnumber - Bên trong hàm
tryToModify, in giá trị đã sửa đổi theo định dạng:Inside function: [value] - Trong hàm
main, khai báo một biến số nguyên tênoriginalvà khởi tạo biến với giá trị 25 - In giá trị ban đầu trước khi gọi hàm theo định dạng:
Before function call: [value] - Gọi hàm
tryToModifyvà truyền biếnoriginallàm đối số - Sau khi gọi hàm, in lại giá trị của
originaltheo đị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: 25Thử 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;
}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