Title Image

Blog Logo

🌱 Pass by Pointer vs Pass by Reference

🌱 Pass by Pointer vs Pass by Reference

Nếu như đã biết về lập trình C, chúng ta đã biết về khái niệm Pass By Value và Pass By Reference. Đây là 2 khái niệm khi chúng ta truyền biến vào một hàm (truyền giá trị hay truyền địa chỉ). C++ cung cấp thêm một khái niệm khác nữa. Trong C++, có 3 cách truyền biến vào hàm:

  • Pass by Value - Truyền tham trị, tương tự như phần C.
  • Pass by Pointer - Truyền con trỏ, tương tự như Pass by Reference ở bài viết trên.
  • Pass by Reference - Truyền tham chiếu, sẽ phân tích ở bên dưới.
    🔻 Cần đọc: Function Call.

    👉 Pass by Value

    Đã phân tích rất kỹ ở bài viết trước!

    👉 Pass by Pointer

    Trường hợp này tương tự như trường hợp Pass by Reference đã được phân tích trong bài viết trước! Trường hợp địa chỉ của biến được truyền vào hàm.

#include <iostream>
using namespace std;

void swap(int *x, int *y)
{     int z = *x;
    *x = *y;     *y = z; } int main()
{     int a = 5, b = 4;
    cout << "Before Swap\n";     cout << "a = " << a << " b = " << b << "\n";
    swap(&a, &b);     cout << "After swap with pass by pointer\n";
    cout << "a = " << a << " b = " << b << "\n";
}     Run This Code    

    ➥ Các bạn có thể bấm "Run This Code", kết quả hiển thị trên màn hình console như sau.

Before Swap
a = 5 b = 4
After swap with pass by pointer
a = 4 b = 5

    Như đã phân tích ở bài viết trước, việc truyền địa chỉ của tham số vào hàm, giúp cho chương trình tác động trực tiếp vào vị trí lưu biến trên bộ nhớ, vì vậy chúng ta có thể thay thế giá trị của các biến.

    Khi muốn truyền pointer (địa chỉ) của biến, có thể dùng toán tử & để lấy địa chỉ: swap(&a, &b);

    👉 Pass by Reference

    Phương pháp Pass by Reference trong C++ cho phép hàm có thể trực tiếp thay đổi biến truyền vào mà không cần tạo ra bản sao của nó. Vị trí bộ nhớ của biến và tham số truyền vào là như nhau.

    Ví dụ,

#include <iostream>
using namespace std;

void swap(int& x, int& y)
{     int z = x;
    x = y;     y = z; } int main()
{     int a = 5, b = 4;
    cout << "Before Swap\n";     cout << "a = " << a << " b = " << b << "\n";
    swap(a, b);     cout << "After swap with pass by pointer\n";
    cout << "a = " << a << " b = " << b << "\n";
}     Run This Code    

    ➥ Các bạn có thể bấm "Run This Code", kết quả hiển thị trên màn hình console như sau.

Before Swap
a = 5 b = 4
After swap with pass by pointer
a = 4 b = 5

    Cách làm này mục đích cũng gần tương tự như Pass by Pointer, đó là thay đổi giá trị của các biến đầu vào. Tuy nhiên, thay vì truyền vào hàm địa chỉ của biến, Pass by Reference tham chiếu trực tiếp đến biến đó để thay đổi nó. 

    👉 Khác nhau giữa Pass by Pointer vs Pass by Reference

Đặc ĐiểmPass by PointerPass by Reference
Tham số truyền vàoĐịa chỉ của biếnTruyền trực tiếp biến
Truy cập vào tham sốDo truyền vào địa chỉ nên cần toán tử * (dereference) để truy cập giá trị của biếnDùng trực tiếp tên của tham số để truy cập giá trị
Phép gánTham số truyền vào có thể được gán lại vào một ô địa chỉ mớiKhông thể thay đổi về mặt địa chỉ
Giá trị NULLPointer có thể có giá trị NULL khi truyền vàoTham số truyền vào cần tham chiếu đến một biến cụ thể, không thể có giá trị NULL


    🔻 Ví dụ cho thấy sự khác nhau giữa Pass by Pointer và Pass by Reference


#include <iostream>
using namespace std;

void swapbyReference(int& x, int& y)
{     cout << "Address of Param (Reference) = " << &x << endl;     int z = x;
    x = y;     y = z; } void swapbyPointer(int *x, int *y)
{     cout << "Address of Param (Pointer) = " << &x << endl;     cout << "Value of Param (Pointer) = " << x << endl;     int z = *x;
    *x = *y;     *y = z; } int main()
{     int a = 5, b = 4;     cout << "Address of Variable = " << &a << endl;     swapbyReference(a, b);     swapbyPointer(&a, &b);
}     Run This Code    

    ➥ Các bạn có thể bấm "Run This Code", kết quả hiển thị trên màn hình console như sau.

Address of Variable = 0x7ffe5d8e4860
Address of Param (Reference) = 0x7ffe5d8e4860
Address of Param (Pointer) = 0x7ffe5d8e4838
Value of Param (Pointer) = 0x7ffe5d8e4860

    Dùng cách in ra địa chỉ của biến a truyền vào 2 hàm, cũng như in ra địa chỉ tham số của hàm để phân biệt sự khác nhau (Trên đây là chạy trên máy của mình, các máy khác sẽ có những địa chỉ khác nhau).

  • Đối với Pass by Reference, địa chỉ của tham số x bằng với địa chỉ của Variable a, tức là tham số truyền vào ở đây chính là biến a truyền vào, chỉ khác tên.
  • Đối với Pass by Pointer, địa chỉ của của tham số x khác với địa chỉ của Variable a, và giá trị của x, chính là địa chỉ của biến a, tức là khi gọi hàm thì cách này sẽ cần tạo ra một biến x để lưu địa chỉ của a.

>>>= Follow ngay =<<<

Để nhận được những bài học miễn phí mới nhất nhé 😊

Chúc các bạn học tập tốt 😊

                                        

Đăng nhận xét

0 Nhận xét