指針本質是一個儲存記憶體地址的變數,而非一個需要 `new` 實例化的對象。`*` 是解引用運算子,用於「透過地址訪問該地址上的對象」。
+----------------+ +----------------+
| 指針變數 p | | 目標對象 obj |
| (儲存地址) |---->| (實際資料) |
| 0x7ffe... | | 位於 0x7ffe...|
+----------------+ +----------------+
| 操作 | 語法 | 說明 |
|---|---|---|
| 宣告指針 | `int *p;` | 分配指針變數本身的儲存空間(通常 8 位元組),未初始化指向隨機地址 |
| 指向現有物件 | `p = &obj;` | 取址運算子 `&` 取得 `obj` 地址賦給 `p`,**obj 已經存在** |
| 動態分配並指向 | `p = new int(42);` | `new` 在堆上建立 `int` 物件,回傳其地址給 `p` |
| 解引用存取 | `*p = 10;` | 透過地址找到物件並修改其值 |
「百度百科說指針是一個對象」
這裡的「對象」泛指「操作的對象/實體」,非 C++ 的 `class` 實例。指針確實是一個「值為地址的變數實體」,但不需要像 `std::string s;` 那樣呼叫建構函式。
現代 C++ (C++11 起) 建議使用 `std::unique_ptr`、`std::shared_ptr` 自動管理生命週期,避免記憶體洩漏:
#include <memory>
auto p = std::make_unique<MyClass>(); // 自動 new,離開作用域自動 delete
p->doSomething(); // 像裸指針一樣使用
指針 = **地址容器**;`*` = **地址→值 的橋樑**。指向的對象「早已在別處實例化」,指針只是拿著那把鑰匙(地址)去開門而已。