Pointer(con trỏ) và reference(tham chiếu) đều là những thứ được sử dụng để truy cập tới những biến khác trong C++. Chính vì điều này có thể nhiều bạn sẽ cảm thấy có chút gì đó khó khăn trong việc sử dụng chúng. Vậy chúng là gì? Chúng có gì khác nhau? Mình sẽ giải thích trong bài viết này.

Pointer và Reference, chúng là cái gì vậy?
Pointer là một biến chứa địa chỉ nhớ của biến khác. Có thể bạn chưa biết, mỗi khi có một biến được khởi tạo, Main memory(thường là RAM) sẽ cấp cho nó một vùng nhớ để biến nó lưu trữ giá trị của mình và pointer được sinh ra để trỏ tới vùng nhớ đó.
Reference giống như là một cái tên khác của biến đó. Khi bạn dùng reference có nghĩa là bạn đang tạo cho biến mà reference đó trỏ tới một cái tên khác là tên biến của reference
int a = 3;
//con trỏ p trỏ tới a(trỏ tới địa chỉ của biến a)
int *p = &a;
//tham chiếu ref trỏ tới a(a có tên khác là ref)
int &ref = a;
Chúng có gì khác nhau?
Cách khởi tạo
Pointer có 2 cách khởi tạo
- Khởi tạo có khai báo
int a = 3;
int *p = &a; - Khởi tạo không khai báo
int *p;
Tuy nhiên, reference thì chỉ có một cách khởi tạo duy nhất là khởi tạo có khai báo
Gán giá trị mới
Pointer có thể gán lại giá trị mới cho nó tuy nhiên reference thì lại không
int a = 3;
int b = 4;
int *p = &a;
p = &b; //Hợp lệ
int &ref = a;
&ref = b; //Báo lỗi [Error] lvalue required as left operand of assignment
Gán gián tiếp
Pointer có thể gán gián tiếp tức là pointer trỏ tới pointer nhưng reference thì không thể làm vậy
int a = 3;
int *p = &a;
int **q = &p; //Hợp lệ
int &ref = a;
int &&otherRef = ref //Không hợp lệ
Vậy khi nào ta dùng pointer và reference?
Theo như sự so sánh ở trên, reference rất thích thích hợp với việc truyền tham số để thay đổi giá trị tham số đó trong hàm
VD: Hàm đổi chỗ 2 số trong C++
void swap(int &a, int &b)
{
int temp = a;
a = b;
b = temp;
}
Pointer thì phù hợp hơn để thực hiện các cấu trúc dữ liệu như mảng(array), danh sách liên kết(linked list), cây(tree),…
VD: In ra màn hình các số có trong mảng sử dụng Pointer
void displayElements(int a[], int n)
{
int *p = a;
for(int i = 0; i < n; i++)
{
std::cout << *p << " ";
p++;
}
}