Gọi hàm theo giá trị trong C

Xin chào các bạn, những nhà mã hóa tương lai! Hôm nay, chúng ta sẽ bắt đầu một chuyến hành trình thú vị vào thế giới lập trình C, cụ thể là khám phá khái niệm "Gọi hàm theo giá trị." Đừng lo nếu bạn là người mới bắt đầu lập trình - tôi sẽ là người bạn thân thiện của bạn, chia nhỏ những ý tưởng phức tạp thành những mảnh nhỏ, dễ tiêu hóa. Vậy, chúng ta cùng vào bài nhé!

C - Function call by Value

Gọi hàm là gì?

Trước khi chúng ta đi sâu vào chi tiết của "Gọi hàm theo giá trị," hãy bắt đầu từ những điều cơ bản. Trong lập trình, một hàm giống như một mini-chương trình trong chương trình chính của bạn. Nó là một bộ hướng dẫn thực hiện một nhiệm vụ cụ thể. Khi chúng ta sử dụng một hàm trong mã của mình, chúng ta gọi nó - vì vậy có thuật ngữ "gọi hàm."

Hãy tưởng tượng bạn đang nướng bánh quy. Công thức là hàm của bạn, và mỗi lần bạn làm một mẻ, bạn đang "gọi" công thức đó. Đơn giản phải không?

Tham số chính thức và tham số thực tế

Bây giờ, hãy giới thiệu hai thuật ngữ quan trọng: tham số chính thức và tham số thực tế.

Tham số chính thức

Tham số chính thức là các tham số được liệt kê trong khai báo hàm. Chúng giống như những placeholders cho biết hàm nên mong đợi thông tin nào.

Tham số thực tế

Tham số thực tế là các giá trị thực tế bạn truyền cho hàm khi bạn gọi nó. Đây là những piece của dữ liệu cụ thể mà hàm sẽ làm việc với.

Hãy xem một ví dụ đơn giản:

#include <stdio.h>

// Khai báo hàm với tham số chính thức
void greet(char name[], int age) {
printf("Xin chào, %s! Bạn %d tuổi.\n", name, age);
}

int main() {
// Gọi hàm với tham số thực tế
greet("Alice", 25);
return 0;
}

Trong ví dụ này, nameage trong hàm greet là các tham số chính thức. Khi chúng ta gọi hàm với greet("Alice", 25), "Alice" và 25 là các tham số thực tế.

Gọi hàm theo giá trị hoạt động như thế nào trong C?

Bây giờ chúng ta đã hiểu các nguyên tắc cơ bản, hãy khám phá trái tim của chủ đề của chúng ta: Gọi hàm theo giá trị.

Trong C, khi bạn truyền các tham số cho một hàm, bạn thường sử dụng "Gọi hàm theo giá trị." Điều này có nghĩa là hàm nhận một bản sao của giá trị bạn truyền, không phải là giá trị gốc.

Hãy phân tích điều này với một ví dụ. Hãy tưởng tượng bạn có một công thức (hàm của chúng ta) yêu cầu 2 cốc bột. Khi bạn làm theo công thức, bạn không mang cả túi bột đến bát trộn. Thay vào đó, bạn đo 2 cốc và thêm vào hỗn hợp của bạn. Túi bột gốc vẫn không thay đổi. Điều này tương tự như cách "Gọi hàm theo giá trị" hoạt động trong C.

Dưới đây là một ví dụ mã để minh họa điều này:

#include <stdio.h>

void modifyValue(int x) {
x = x * 2;
printf("Trong hàm: x = %d\n", x);
}

int main() {
int num = 10;
printf("Trước khi gọi hàm: num = %d\n", num);

modifyValue(num);

printf("Sau khi gọi hàm: num = %d\n", num);

return 0;
}

Khi bạn chạy đoạn mã này, bạn sẽ thấy:

Trước khi gọi hàm: num = 10
Trong hàm: x = 20
Sau khi gọi hàm: num = 10

Ngạc nhiên phải không? Hãy phân tích nó:

  1. Chúng ta bắt đầu với num = 10 trong hàm main.
  2. Chúng ta gọi modifyValue(num), tạo ra một bản sao của num và gọi nó là x.
  3. Trong modifyValue, chúng ta gấp đôi x, làm cho nó thành 20.
  4. Nhưng khi chúng ta quay lại main, num vẫn là 10!

Đây là bản chất của "Gọi hàm theo giá trị." Hàm làm việc với một bản sao, để lại giá trị gốc không thay đổi.

Lợi ích của việc gọi hàm theo giá trị

Bạn có thể tự hỏi, "Tại sao lại sử dụng Gọi hàm theo giá trị?" Câu hỏi tuyệt vời! Dưới đây là một vài lý do:

  1. An toàn: Dữ liệu gốc của bạn được bảo vệ khỏi những thay đổi không mong muốn.
  2. Đơn giản: Nó dễ hiểu và dễ triển khai.
  3. Dễ dự đoán: Hàm sẽ không có tác dụng phụ không mong muốn trên các biến của bạn.

Khi nào gọi hàm theo giá trị có thể không lý tưởng

Mặc dù Gọi hàm theo giá trị rất tốt cho nhiều trường hợp, nó không phải lúc nào cũng là lựa chọn tốt nhất. Ví dụ:

  1. Cấu trúc dữ liệu lớn: Sao chép một lượng lớn dữ liệu có thể không hiệu quả.
  2. Cần thay đổi trực tiếp: Đôi khi bạn muốn hàm thay đổi giá trị gốc.

Trong những trường hợp này, C cung cấp các phương pháp khác như "Gọi hàm theo tham chiếu," nhưng đó là chủ đề cho một ngày khác!

Thời gian thực hành!

Bây giờ bạn đã hiểu Gọi hàm theo giá trị, hãy thực hành với một ví dụ thú vị:

#include <stdio.h>

void birthday(int age) {
age++;
printf("Chúc mừng sinh nhật! Bạn bây giờ %d tuổi trong hàm.\n", age);
}

int main() {
int myAge = 30;
printf("Trước sinh nhật: Tôi %d tuổi.\n", myAge);

birthday(myAge);

printf("Sau khi gọi hàm sinh nhật: Tôi vẫn %d tuổi trong main.\n", myAge);

return 0;
}

Chạy đoạn mã này và xem会发生什么. Bạn có thể giải thích kết quả dựa trên những gì bạn đã học về Gọi hàm theo giá trị không?

Kết luận

Chúc mừng! Bạn vừa bước những bước đầu tiên vào việc hiểu Gọi hàm theo giá trị trong C. Nhớ rằng, thực hành là cách tốt nhất để hoàn thiện, vì vậy đừng ngần ngại thử nghiệm với các ví dụ mã của riêng bạn.

Trong bài học tiếp theo, chúng ta sẽ khám phá các khái niệm hàm phức tạp hơn. Đến那个时候, hãy tiếp tục mã hóa, 保持好奇心, và nhớ - trong thế giới Gọi hàm theo giá trị, những gì xảy ra trong hàm, stays in the function!

Chúc các bạn mã hóa vui vẻ, các nhà lập trình tương lai!

Credits: Image by storyset