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 — là 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ớiKiểu dữ liệu
củabiến con trỏ
phải trùng với kiểu dữ liệu củabiế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;
}