Con trỏ(Pointer) và tham chiếu(reference) trong C++: Chúng là gì vậy?

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

  1. Khởi tạo có khai báo
    int a = 3;
    int *p = &a;
  2. 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

int &ref = a;

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++;
    }
}

Leave a comment