空指針是指不指向任何有效記憶體位址的指針。系統保證空指針不會指向任何實際對象或函數。在 C/C++ 中,將指針賦值為 0 或等價的常量表達式即可得到空指針。
假設 p 是指針變量,以下賦值均使 p 成為空指針:
p = 0;p = 0L;p = '\0';p = 3 - 3;p = 0 * 17;p = (void*)0; (僅 C 語言)本質上,編譯器將整數常量 0 視為空指針常量,在指針上下文中自動轉換為對應類型的空指針值。
NULL 是標準庫定義的宏,用於表示空指針常量,提高代碼可讀性。通常定義為:
#define NULL 0 // C++ 常見定義 #define NULL ((void*)0) // C 語言常見定義
使用 p = NULL; 可明確語義,但需包含對應頭文件(如 <cstddef>、<cstdlib> 或 <stdio.h>)。
if (p == 0) if (p == NULL) if (NULL == p) // 防止誤寫成賦值的防禦性寫法 if (!p) // 利用指針隱式轉 bool:空指針為 false
if (p != 0) if (p != NULL) if (NULL != p) if (p) // 非空指針隱式轉為 true
!p 的爭議NULL 為 0,某些實現可能定義為非零值(極少見)。若 NULL != 0,則 !p 在 p == NULL 時可能評估為 false,導致邏輯錯誤。現代標準(C++11 起)已規範 NULL 為 0,但為了極致可移植性,建議顯式比較 p == nullptr (C++11) 或 p == NULL。
C++11 引入 nullptr 關鍵字,解決了 NULL 的類型安全問題:
std::nullptr_t,可隱式轉換為任意指針類型int* p = nullptr; // 推薦 if (p == nullptr) ... // 清楚、安全
| 場景 | 推薦寫法 | 備註 |
|---|---|---|
| 賦值為空 | p = nullptr; (C++11+) | 類型安全,語義明確 |
| 判斷空指針 | if (p == nullptr) | 現代 C++ 首選 |
if (!p) | 簡潔,廣泛使用,現代標準下安全 | |
| 判斷非空 | if (p) | 慣用語,簡潔明瞭 |
| C 語言代碼 | p = NULL; if (p == NULL) | 需包含標準頭文件 |