C/C++ Basics

Hàm và cách truyền tham số trong C, C++

Trong bài học này, bạn sẽ so sánh ba cách truyền tham số cho hàm: truyền giá trị, truyền con trỏ và truyền tham chiếu.

Giới thiệu

Mặc định, khi truyền một biến vào hàm, C và C++ tạo ra một bản sao của biến đó, nên mọi thay đổi bên trong hàm không ảnh hưởng đến biến gốc. Nếu muốn hàm thay đổi được biến gốc, nơi gọi hàm phải cho phép điều đó một cách rõ ràng, bằng con trỏ trong C hoặc tham chiếu trong C++.

Những điểm quan trọng

  • Luôn bật cảnh báo của trình biên dịch (compiler warning) và sửa hết các cảnh báo.
  • Hiểu rõ kiểu dữ liệu và thời gian tồn tại (lifetime) của từng giá trị.
  • Luôn kiểm tra dữ liệu đầu vào và giới hạn chỉ số của mảng.

Code ví dụ bằng C và C++

C
Chạy code →
main.c
#include <stdio.h>

void swap_ints(int *left, int *right) {
    int temporary = *left;
    *left = *right;
    *right = temporary;
}

int main(void) {
    int a = 4, b = 9;
    swap_ints(&a, &b);
    printf("%d %d\n", a, b);
    return 0;
}
Kết quả khi chạy
9 4
C++
Chạy code →
main.cpp
#include <iostream>

void swap_ints(int& left, int& right) {
    int temporary = left;
    left = right;
    right = temporary;
}

int main() {
    int a = 4, b = 9;
    swap_ints(a, b);
    std::cout << a << ' ' << b << '\n';
}
Kết quả khi chạy
9 4

So sánh C và C++

Trong C, hàm swap_ints nhận địa chỉ của hai biến và dùng toán tử * để truy cập rồi đổi giá trị của chúng. Trong C++, tham chiếu (reference) hoạt động như một tên gọi khác của biến gốc, nên cú pháp ngắn gọn hơn mà vẫn thay đổi được giá trị. Từ khóa const trên tham số cho biết hàm chỉ đọc chứ không sửa dữ liệu.

C

C dùng các hàm thủ tục gọn nhẹ và thể hiện rõ cách dữ liệu được biểu diễn trong bộ nhớ.

C++

C++ vẫn cho phép làm việc ở mức thấp nhưng bổ sung các kiểu dữ liệu thư viện và công cụ trừu tượng an toàn hơn.

Bài tập mở rộng

Hãy chạy cả hai phiên bản, sau đó thử thay đổi code để quan sát sự khác biệt về mức độ an toàn mà mỗi ngôn ngữ mang lại.

  • Thử nhập dữ liệu sai và các giá trị ở biên.
  • Biên dịch với các cờ -Wall -Wextra -Wpedantic để bật thêm cảnh báo.
  • Tách phần khai báo dùng chung ra file header và phần cài đặt ra file riêng.

Luyện tập với thử thách

Áp dụng kiến thức của bài học này để giải một bài toán thực tế. Mỗi thử thách chạy ngay trên trình duyệt, có kiểm thử tức thì và AI nhận xét.

Tất cả thử thách