Con trỏ null
Thuộc phần Logic và luồng chương trình trong hành trình C++ của Coddy. Bài học 4 trên 56.
Khi khai báo một con trỏ, nó không tự động trỏ đến thứ gì có ý nghĩa. Con trỏ chưa được khởi tạo chứa các địa chỉ bộ nhớ ngẫu nhiên, có thể gây ra lỗi nghiêm trọng nếu bạn cố sử dụng nó. Đây là lúc con trỏ null trở nên thiết yếu để lập trình an toàn.
Con trỏ null là con trỏ chỉ rõ rằng nó không trỏ đến đâu cả. Trong C++ hiện đại, bạn tạo con trỏ null bằng cách khởi tạo nó với nullptr:
int* ptr = nullptr; // ptr hiện là con trỏ nullTừ khóa nullptr cho biết con trỏ không trỏ đến vị trí bộ nhớ hợp lệ nào. Cách này an toàn hơn nhiều so với việc để con trỏ chưa được khởi tạo, vì bạn có thể kiểm tra xem con trỏ có phải là null hay không trước khi thử giải tham chiếu nó.
Trước khi dùng bất kỳ con trỏ nào, bạn nên kiểm tra xem nó có phải là null bằng một câu lệnh if đơn giản hay không:
if (ptr != nullptr) {
// Bạn có thể dùng *ptr ở đây một cách an toàn
int value = *ptr;
}Bài luyện tập này giúp chương trình của bạn không bị dừng đột ngột do truy cập vào vị trí bộ nhớ không hợp lệ. Luôn khởi tạo con trỏ bằng nullptr khi khai báo, và kiểm tra xem con trỏ có phải là null hay không trước khi giải tham chiếu.
Thử thách
DễTạo một chương trình minh họa cách sử dụng con trỏ an toàn bằng cách kiểm tra con trỏ null trước khi giải tham chiếu chúng.
Đầu vào sẽ gồm:
- Một chuỗi có giá trị là
"valid"hoặc"null"
Chương trình của bạn cần:
- Khai báo một biến số nguyên tên là
datavà khởi tạo biến với giá trị42 - Khai báo một con trỏ tên là
ptr - Nếu đầu vào là
"valid", gán địa chỉ củadatachoptr - Nếu đầu vào là
"null", gánnullptrchoptr - Dùng câu lệnh if để kiểm tra
ptrkhác null trước khi sử dụng - Nếu con trỏ khác null, in ra giá trị mà con trỏ trỏ đến
- Nếu con trỏ là null, in ra thông báo an toàn
Dùng định dạng đầu ra chính xác sau:
Value: [value]Với con trỏ null, dùng định dạng này:
Pointer is null - cannot dereferenceTự làm thử
#include <iostream>
#include <string>
using namespace std;
int main() {
// Đọc đầu vào (input)
string input;
cin >> input;
// Khai báo biến (variable) data
int data = 42;
// TODO: Viết code của bạn ở đây
// Khai báo con trỏ tên là ptr
// Kiểm tra đầu vào và gán giá trị (value) phù hợp cho ptr
// Dùng câu lệnh if để kiểm tra và sử dụng con trỏ một cách an toàn
return 0;
}Bài học này có một bài trắc nghiệm ngắn. Bắt đầu bài học để trả lời và theo dõi tiến độ.
Tất cả bài học trong Logic và luồng chương trình
1Con trỏ và bộ nhớ
Con trỏ là gì?Toán tử lấy địa chỉToán tử giải tham chiếuCon trỏ nullCon trỏ và mảngBộ nhớ động với newGiải phóng bộ nhớ với deleteÔn tập: luyện tập về con trỏ2Vector (mảng động)
Giới thiệu std::vectorTạo vectorThêm phần tửTruy cập phần tửKích thước vectorDuyệt bằng vòng lặp forVòng lặp for dựa trên phạm viXóa phần tửÔn tập: các thao tác với vector5Dự án: Công cụ quản lý hàng tồn kho
Thiết lập dự ánThêm và cập nhật mặt hàng3Dự án: Công cụ danh sách công việc
Tổng quan dự ánThêm công việc6Tập hợp (các phần tử duy nhất)
Giới thiệu std::setTạo tập hợp và thêm phần tửKiểm tra phần tửXóa phần tửDuyệt qua tập hợpÔn tập: các số duy nhấtTự luyện tập: Trình biên dịch C++ online