Sự khác nhau giữa gọi hàm truyền kiểu value, reference và pointer trong C++

Đối với những bạn mới học lập trình c và c++ hay cảm thấy trừu tượng và khó hiểu về cách sử dụng và khái niệm liên quan đến việc sử dụng kiểu dữ liệu value, reference và pointer trong lập trình c++. Nhưng đây là một trong những điều thú vị của lập trình. Do vậy trong bài viết này tôi sẽ đề cập và làm rõ các vấn đề đối với hàm truyền theo 3 cách trên trong lập trình c++.

  1. 1. HÀM TRUYỀN GIÁ TRỊ (CALL BY VALUE)

Khi chúng ta gọi hàm có đối số truyền kiểu giá trị, nó sẽ thực hiện copy giá trị của tham số thực tế cho các đối số hình thức của hàm. Vì vậy mặc dù trong hàm có sự thao thác và làm thay đổi đối số nhưng sau lời gọi hàm các tham số thực tế vẫn không thay đổi.

Mặc định trong C++ sẽ sử dụng truyền tham số theo kiểu giá trị. Ví dụ như hàm hoán đổi sau.

Mục đích chúng ta muốn sau khi gọi hàm ví dụ: swap(a, b) với a = 5, b = 10 thì sẽ nhận được a = 10, b = 5. Tuy nhiên sau lời gọi hàm giá trị nó vẫn giữ nguyên.

  1. 2. HÀM TRUYỀN THAM CHIẾU (CALL BY REFERENCE)

Đối với gọi hàm với các tham số dạng tham chiếu (reference) nó sẽ thực hiện sao chép (copy) tham chiếu các đối số thực tế vào tham số hình thức. Do vậy trong hàm có sự thay đổi đối với các đối số hình thức đồng nghĩa làm thay đổi các tham số thực tế sau lời gọi hàm.

Các bạn có thể xem và chạy ví dụ sau:

3. HÀM  TRUYỀN CON TRỎ HAY ĐỊA CHỈ (CALL BY POINTER)

Khi gọi hàm với các tham số dạng con trỏ nó sẽ thực hiện sao chép (copy) địa chỉ của đối số thực tế cho tham số hình thức. Trong hàm nếu có sự thay đổi đối số cũng đồng nghĩa với thay đổi các tham số chính thức sau lời gọi hàm. Như ví dụ hàm hoán đổi swap sau:

Sự khác biệt giữ kiểu gọi hàm kiểu giá trị và kiểu tham chiếu trong C/C++

S. No. Call by Value Call by Reference
1. Một giá trị sẽ được copy từ tham số chính thức cho tham số hình thức Tham chiếu của tham số chính thức đến tham số hình thức
2. Trong hàm nếu có sự thay đổi với các đối số hình thức thì sau lời gọi hàm giá trị của các tham số chính thức vẫn không thay đổi Trong hàm nếu có sự thay đổi đối số hình thức sẽ dẫn đến thay đổi tham số chính thức
3. Sử dụng bộ nhớ độc lập giữa đối số hình thức và tham số chính thức Sử dụng chung bộ nhớ giữa đối số hình thức và tham số chính thức

 

Bên cạnh đó các học lập trình c và học lập trình c++ cũng cần chú ý với c chỉ có kiểu value và pointer còn c++ có đủ 3 kiểu dữ liệu mà tôi đề cập ở trên. Cảm ơn các bạn đã đọc bài hy vọng qua bài viết này sẽ giúp các bạn hiểu rõ hơn những khái niệm trọng tâm trong lập trình c/c++.

Nhận xét