1. Cấu trúc hàm trong C

Một hàm trong C thường bao gồm các thành phần sau:

  • Tiêu đề (header) của hàm: Phần này xác định tên hàm, kiểu trả về và các tham số (nếu có).
  • Thân hàm: Phần này chứa các câu lệnh thực thi thực hiện tác vụ được chỉ định bởi hàm.

Đây là một ví dụ đơn giản về hàm C tính tổng của hai số nguyên:

int sum(int a, int b) {
   int result;
   result = a + b;
   return result;
}
Trong ví dụ này, tiêu đề hàmint sum(int a, int b)thân hàmkhối câu lệnh nằm giữa dấu ngoặc nhọn {}. Hàm trả về một giá trị nguyên, là tổng của a và b.

2. Các loại hàm:

Trong C có 2 loại hàm chính:

  • Hàm thư viện: Đây là các hàm được xác định trước trong C thực hiện các tác vụ phổ biến, chẳng hạn như thao tác nhập/xuất, xử lý chuỗi, tính toán toán học, v.v.
  • Hàm do người dùng định nghĩa: Đây là các hàm do người lập trình tạo ra để thực hiện các tác vụ cụ thể. Chúng có thể được gọi bởi hàm main() hoặc các hàm khác.

Ngoài ra còn có nhiều cách phân loại hàm khác dựa trên số lượng và loại đối số, loại giá trị trả về, v.v. Một số cách phân loại phổ biến là:

  • Hàm không có đối số và không có giá trị trả về
  • Hàm có đối số và không có giá trị trả về
  • Hàm có đối số và giá trị trả về
  • Hàm không có đối số nhưng trả về giá trị.

3. Đối số và tham số:

Trong lập trình, đối sốtham số lần lượt được sử dụng trong các lệnh gọi hàm và định nghĩa hàm.

  • Đối số là một giá trị được truyền cho một hàm khi nó được gọi. Ví dụ, trong lệnh gọi hàm sau:

int result = multiply(5, 10);

Các giá trị 5 và 10 là các đối số được truyền cho hàm nhân.

  • Tham số là một biến trong định nghĩa hàm nhận đối số được truyền cho hàm khi nó được gọi. Ví dụ, trong định nghĩa hàm sau:

int multiply(int a, int b) {
    return a * b;
}
Các biến a và b là các tham số nhận các giá trị được truyền dưới dạng đối số trong lệnh gọi hàm. Trong ví dụ này, a sẽ có giá trị 5 và b sẽ có giá trị 10.

4. Gọi hàm trong C

Trong C, một hàm có thể được gọi bằng cách sử dụng tên của nó, theo sau là một tập hợp các dấu ngoặc đơn và các đối số được phân tách bằng dấu phẩy. Ví dụ:

#include <stdio.h>
int add(int a, int b) {
   return a + b;
}

int main() {
   int num1 = 5;
   int num2 = 7;
   int result = add(num1, num2);
   printf("The result of adding %d and %d is: %d", num1, num2, result);
   return 0;
}
Trong ví dụ này, hàm add nhận hai đối số nguyên a và b và trả về tổng của chúng. Hàm add được gọi trong hàm chính bằng cách chuyển num1 và num2 làm đối số và lưu kết quả vào biến kết quả. Kết quả sau đó được in ra màn hình bằng hàm printf.

4.1. Truyền tham số theo giá trị

Truyền theo giá trị trong C đề cập đến việc chuyển một bản sao giá trị của một đối số cho một hàm, thay vì chuyển một tham chiếu đến chính đối số đó. Hàm hoạt động trên giá trị được sao chép này, nhưng đối số ban đầu trong phạm vi của người gọi vẫn không thay đổi.

Đây là một ví dụ để minh họa khái niệm này:

#include <stdio.h>
void swap_values(int x, int y) {
    int temp = x;
    x = y;
    y = temp;
}

int main() {
    int a = 5, b = 10;
    printf("Before calling swap_values(), a = %d, b = %d\n", a, b);
    swap_values(a, b);
    printf("After calling swap_values(), a = %d, b = %d\n", a, b);
    return 0;
}
Output:

Before calling swap_values(), a = 5, b = 10
After calling swap_values(), a = 5, b = 10

Như bạn có thể thấy, các giá trị của a và b vẫn không thay đổi ngay cả sau khi gọi hàm swap_values(), bởi vì hàm chỉ hoạt động trên các bản sao của các giá trị của a và b, không phải các đối số ban đầu.

4.2. Truyền tham số theo tham chiếu

Truyền theo tham chiếu trong C là một cơ chế truyền đối số cho hàm trong đó hàm nhận tham chiếu (con trỏ) đến đối số chứ không phải là bản sao giá trị của nó. Đây là một ví dụ:

#include <stdio.h>
void swap(int *a, int *b) {
    int temp = *a;
    *a = *b;
    *b = temp;
}

int main() {
    int x = 5, y = 10;
    printf("Before swap: x = %d, y = %d\n", x, y);
    swap(&x, &y);
    printf("After swap: x = %d, y = %d\n", x, y);
    return 0;
}

Trong ví dụ này, hàm swap nhận hai con trỏ int a và b, đồng thời hoán đổi giá trị của chúng bằng cách thao tác với các giá trị được trỏ tới bởi các con trỏ. Trong hàm main, hai biến số nguyên x và y được khai báo và khởi tạo, sau đó được chuyển đến hàm swap theo tham chiếu, sử dụng toán tử địa chỉ &. Các giá trị của x và y được hoán đổi bên trong hàm và được thay đổi.