Tại sao phải dùng con trỏ trong c++

Có một tác dụng của con trỏ nữa, bạn có thể xem ví dụ sau:
Chẳng hạn bạn có một hàm muốn đổi chỗ 2 số nguyên chẳng hạn:
Nếu không dùng con trỏ:

void Swap(int x, int y)
{
int temp = x;
x = y;
y = tem;
}
int main()
{
int a = 1, b = 2;
std::cout << "Truoc khi goi ham Swap: a = " << a  << ", b = " << b;
Swap(a, b);
std::cout << "Sau khi goi ham Swap: a = " << a  << ", b = " << b;
return 0;
}

Bây giờ trong hàm main bạn thử khai báo 2 số nguyên rồi gọi hàm này, sau đó in ra 2 số đó xem nó có thay đổi giá trị cho nhau ko nhé, câu trả lời là không, vì khi khi ta truyền như vậy thì đoạn code trong hàm main ở dòng Swap(a, b) sẽ được hiểu là:

x = a;
y = b;
int temp = x;
x = y;
y = temp;

Rõ ràng hàm này không thể thực hiện chức năng như mong muốn vì nó chỉ làm trên 2 bản sao của a và b mà thôi.
Bây giờ nếu ta dùng con trỏ:

void Swap(int *x, int *y)
{
int temp = *x;
*x = *y;
*y = temp;
}

Bây giờ hàm main thay vì truyền giá trị của a và b thì ta truyền vào địa chỉ của chúng

int main()
{
int a = 1, b = 2;
std::cout << "Truoc khi goi ham Swap: a = " << a  << ", b = " << b;
Swap(&a, &b);
std::cout << "Sau khi goi ham Swap: a = " << a  << ", b = " << b;
return 0;
}

Giải thích:
Chỗ gọi hàm Swap(&a, &b) sẽ được hiểu như sau:

x = &a; // Lưu ý x là con trỏ cho nên giá trị của nó là địa chỉ của 1 biến
y = &b; // y tương tự x
int temp = *x; // *x chính là lấy giá trị mà con trỏ x đang trỏ tới địa chỉ đấy.(ở đây là địa chỉ của a)
*x = *y;
*y = temp;

Do đó hàm Swap lúc này đã thỏa mãn được yêu cầu đổi giá trị 2 số a và b.
Ngoài ra trong C++ thì bạn còn có thể dùng các truyền tham chiếu bằng cách dùng dấu “&”

Mình hiểu sao nói vậy, nếu có gì sai sót mong mọi người đòng góp thêm ạ :slight_smile: