🌱 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.
👉 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ểm | Pass by Pointer | Pass by Reference |
---|---|---|
Tham số truyền vào | Địa chỉ của biến | Truyề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ến | Dùng trực tiếp tên của tham số để truy cập giá trị |
Phép gán | Tham số truyền vào có thể được gán lại vào một ô địa chỉ mới | Không thể thay đổi về mặt địa chỉ |
Giá trị NULL | Pointer có thể có giá trị NULL khi truyền vào | Tham 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 😊