Pointer và địa chỉ
Pointer chứa địa chỉ của object có type tương thích; dereference truy cập object tại địa chỉ đó.
Pointer và địa chỉ là gì?
Pointer chứa địa chỉ của object có type tương thích; dereference truy cập object tại địa chỉ đó.
Lưu địa chỉ, dereference và thay đổi object gốc.
Điểm quan trọng
- Pointer chỉ được trỏ tới object còn sống, đúng type hoặc null.
- Mỗi vùng nhớ sở hữu chỉ được giải phóng đúng một lần.
- Thể hiện ownership và const rõ ràng trong API.
Code ví dụ bằng C và C++
main.c
#include <stdio.h>
int main(void) {
int score = 70;
int *score_ptr = &score;
*score_ptr += 5;
printf("score=%d same-address=%s\n", score,
score_ptr == &score ? "yes" : "no");
return 0;
}
score=75 same-address=yes
C++
main.cpp
#include <iostream>
int main() {
int score = 70;
int* score_ptr = &score;
*score_ptr += 5;
std::cout << "score=" << score << " same-address="
<< std::boolalpha << (score_ptr == &score) << '\n';
}
score=75 same-address=true
So sánh C và C++
C dùng raw pointer trực tiếp. C++ vẫn dùng raw pointer cho non-owning access nhưng ưu tiên reference khi null không có ý nghĩa.
C
Ownership và cleanup là quy ước do lập trình viên tự bảo đảm.
C++
Container và RAII gắn ownership cùng cleanup vào lifetime của object.
Bài tập mở rộng
Chạy cả hai phiên bản rồi thay đổi để quan sát khác biệt về bảo đảm của từng ngôn ngữ.
- Test null và trường hợp cấp phát thất bại.
- Chạy AddressSanitizer và UndefinedBehaviorSanitizer.
- Ghi rõ pointer nào sở hữu và pointer nào chỉ quan sát.