1. Tham chiếu

1.1 Tạo biến tham chiếu

Biến tham chiếu (reference variable) là một tham chiếu đến một biến đã tồn tại.

Cú pháp:

[Kiểu dữ liệu] &[Tên biến tham chiếu] = [Tên biến đã tồn tại];
// hoặc
[Kiểu dữ liệu] & [Tên biến tham chiếu] = [Tên biến đã tồn tại];
// hoặc
[Kiểu dữ liệu]& [Tên biến tham chiếu] = [Tên biến đã tồn tại];
  • &: gọi là toán tử address-of (address-of operator)

Ví dụ 1:

// string la Kieu du lieu
// traiCay la Ten bien da ton tai
string traiCay = "Xoai";
// monTrangMieng la Ten bien tham chieu
string &monTrangMieng = traiCay;

cout << traiCay << "\n";  // Ket qua la Xoai
cout << monTrangMieng << "\n";  // Ket qua la Xoai

Ví dụ 2, thay đổi giá trị của biến tham chiếu:

#include <iostream>
#include <string>
using namespace std;

int main() {
  // string la Kieu du lieu
  // traiCay la Ten bien da ton tai
  string traiCay = "Xoai";
  // monTrangMieng la Ten bien tham chieu
  string &monTrangMieng = traiCay;

  cout << traiCay << "\n";  // Ket qua la Xoai
  cout << monTrangMieng << "\n";  // Ket qua la Xoai

  traiCay = "Mit";
  cout << traiCay << "\n";  // Ket qua la Mit
  cout << monTrangMieng << "\n";  // Ket qua la Mit

  monTrangMieng = "Buoi";
  cout << traiCay << "\n";  // Ket qua la Buoi
  cout << monTrangMieng << "\n";  // Ket qua la Buoi
  return 0;
}

1.2 Địa chỉ vùng nhớ

Toán tử & đã được sử dụng để tạo một biến tham chiếu, và nó cũng được sử dụng để lấy địa chỉ vùng nhớ (memory address) của một biến vị trí lưu trữ biến trong máy tính (trong RAM).

Khi một biến được tạo trong C++, một địa chỉ vùng nhớ sẽ được gán cho biến đó. Và khi chúng ta gán một giá trị cho biến, nó sẽ được lưu trong địa chỉ vùng nhớ này.

Cú pháp lấy địa chỉ vùng nhớ của một biến:

&[Tên biến]

Ví dụ

#include <iostream>
#include <string>
using namespace std;

int main() {
  string traiCay = "Xoai";

  cout << &traiCay; // Ket qua 0x7fff08b56900
  return 0;
}

Địa chỉ vùng nhớ có dạng hexa (bắt đầu với 0x), kết quả ở mỗi máy sẽ mỗi khác.

2/ Con trỏ

Con trỏ  (pointer) là một biến dùng để lưu trữ địa chỉ vùng nhớ của một biến khác.

Cú pháp tạo biến con trỏ:

[Kiểu dữ liệu] *[Tên biến con trỏ] = &[Tên biến đã tồn tại];
// hoặc
[Kiểu dữ liệu] * [Tên biến con trỏ] = &[Tên biến đã tồn tại];
// hoặc
[Kiểu dữ liệu]* [Tên biến con trỏ] = &[Tên biến đã tồn tại];
  • *: gọi là toán tử dereference (dereference operator)
  • Dereference: nghĩa là truy cập vào vùng nhớ mà một con trỏ trỏ tới
  • Kiểu dữ liệu của biến con trỏ phải trùng với kiểu dữ liệu của biến đã tồn tại

Ví dụ:

#include <iostream>
#include <string>
using namespace std;

int main() {
  string traiCay = "Xoai";
  // Khai bao bien con tro monTrangMieng
  string* monTrangMieng = &traiCay; // traiCay la "bien da ton tai"

  cout << traiCay << "\n"; // Ket qua Xoai
  cout << &traiCay << "\n"; // Ket qua 0x7fff08b56900
  cout << monTrangMieng << "\n"; // Ket qua 0x7fff08b56900
  cout << *monTrangMieng << "\n"; // Ket qua Xoai
  return 0;
}
tham-chieu-va-con-tro-2.png (239 KB)
Biến lưu trữ trong bộ nhớ máy tính (RAM)