Bài học theo mô-đun (2/2)
Con trỏ
Con trỏ là một trong những tính năng mạnh mẽ và đặc biệt nhất của C++. Chúng cho phép bạn truy cập trực tiếp vào bộ nhớ vật lý của máy tính, cho phép quản lý tài nguyên hiệu quả và hiệu suất cao.
1. Bộ nhớ và Địa chỉ là gì?
Mọi biến bạn khai báo trong chương trình đều được lưu trữ trong một ô của bộ nhớ RAM. Mỗi ô có một địa chỉ bộ nhớ duy nhất (thường được biểu thị ở định dạng thập lục phân, ví dụ: 0x7ffee3bf87ac).
C++ cho phép chúng ta lấy địa chỉ bộ nhớ của bất kỳ biến nào bằng cách sử dụng địa chỉ của toán tử &:
int x = 42;
std::cout << &x; // Prints the memory address of x (e.g., 0x7ffee3bf87ac)2. Định nghĩa con trỏ
Con trỏ là một biến đặc biệt lưu trữ địa chỉ bộ nhớ của một biến khác làm giá trị của nó.
Cú pháp yêu cầu sử dụng dấu hoa thị * sau kiểu dữ liệu:
int x = 42;
int* ptr = &x; // ptr is a pointer to an integer that contains the address of x3. Toán tử quy định (*)
Để truy cập hoặc sửa đổi giá trị được lưu trữ tại địa chỉ mà con trỏ trỏ tới, chúng ta sử dụng toán tử quy chiếu (hoặc toán tử gián tiếp), cũng được biểu thị bằng ký hiệu *:
int x = 42;
int* ptr = &x;
std::cout << *ptr; // Prints 42 (the value ptr points to)
*ptr = 100; // Modifies the value of x through the pointer
std::cout << x; // Now prints 100!4. Con trỏ rỗng: nullptr
Một con trỏ không trỏ đến bất kỳ địa chỉ hợp lệ nào phải được khởi tạo bằng từ khóa nullptr (được giới thiệu trong C++ 11):
int* ptr = nullptr; // Safe null pointerHãy tự mình thử
Trong main, có một giá trị biến số nguyên được khởi tạo là 42. Khai báo một con trỏ tới số nguyên ptr trỏ đến địa chỉ của giá trị. Sử dụng tính năng hủy tham chiếu của ptr để đặt giá trị của giá trị thành 100 và cuối cùng in giá trị bằng std::cout.
Hiển thị gợi ý
Khai báo con trỏ bằng `int* ptr = &value;`, sửa đổi giá trị bằng cách hủy tham chiếu `*ptr = 100;`, và in `std::cout << value;`.
Giải pháp khả dụng sau 3 lần thử
Xác định hàm doubleValue chấp nhận một con trỏ tới một số nguyên (int* ptr) và nhân giá trị mà nó trỏ tới với 2 (nếu con trỏ không rỗng). Trong main, gọi doubleValue truyền địa chỉ của biến num và in nó.
Hiển thị gợi ý
Hàm phải chấp nhận `int* ptr`. Bên trong, sử dụng `*ptr = (_ptr) _ 2`. Trong main gọi nó bằng `doubleValue(&num);`.
Giải pháp khả dụng sau 3 lần thử
Với mã được cung cấp, biểu thức nào cho phép bạn sửa đổi trực tiếp giá trị của a, đặt nó thành 10?
int a = 5;
int* p = &a;
// quale istruzione assegna 10 ad a?