記得如何將字元或字串指定為 null 嗎?字串中的空字元 '\0' 代表字串結尾。同理,若指標被指定為空指標,則它不指向任何有效物件。空指標常以 0 或 NULL (C++11 起建議使用 nullptr) 表示,廣泛用於邏輯判斷中檢查指標有效性。
#include <iostream>
int main() {
int x = 12345;
int* px = &x;
while (px) { // px 非空 (非 0) 進入迴圈
std::cout << "指標 px 指向了某些東西\n";
px = 0; // 設為空指標
}
std::cout << "指標 px 現在指向空指標!\n";
return 0;
}
當必須測試指標狀態以確定其是否持有有效位址時,空指標檢查極為實用。
程式設計師常面臨執行前無法預知所需記憶體大小的情況,這正是動態記憶體配置大顯身手之處。
除了 & (address-of) 運算子,C++ 提供 new 運算子為特定資料、結構、類別配置記憶體,並以指標形式返回位址。new 作為右值使用:
int n = 10;
SOMETYPE* parray, *pS;
int* pint;
parray = new SOMETYPE[n]; // 配置 n 個 SOMETYPE 陣列
pS = new SOMETYPE; // 配置單一 SOMETYPE 物件
pint = new int; // 配置單一 int
透過指標直接管理記憶體區塊,而非透過變數定義,你不再是「中間人」。動態配置讓你在不知陣列確切大小的情況下靈活處理大型資料結構。
new 配置的記憶體必須顯式釋放,使用 delete (單一物件) 或 delete[] (陣列):
delete[] parray; // 釋放陣列 (必須用 delete[])
delete pint; // 釋放單一 int
鐵律:每個 new 必須配對 delete,否則導致記憶體洩漏,程式長期運行效能下降甚至崩潰。
delete nullptr; (或 delete 0;) 是合法且無操作的,防止誤刪未配置記憶體。new 與 delete 不必在同一函數,可在一個函數配置、另一個函數釋放 (需傳遞指標),極大靈活性。下一篇將探討函數返回指標/參考的規則與陷阱,以及完整術語總結。