首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C++ >> 關於C++

C/C++ 空指針、空指針常量與 NULL 深度解析

     編輯:關於C++

什麼是空指針?

空指針是指不指向任何有效記憶體位址的指針。系統保證空指針不會指向任何實際對象或函數。在 C/C++ 中,將指針賦值為 0 或等價的常量表達式即可得到空指針。

常見的空指針賦值方式

假設 p 是指針變量,以下賦值均使 p 成為空指針:

  • p = 0;
  • p = 0L;
  • p = '\0';
  • p = 3 - 3;
  • p = 0 * 17;
  • p = (void*)0; (僅 C 語言)

本質上,編譯器將整數常量 0 視為空指針常量,在指針上下文中自動轉換為對應類型的空指針值。

NULL 宏

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 的爭議
早期 C 標準未強制 NULL 為 0,某些實現可能定義為非零值(極少見)。若 NULL != 0,則 !p 在 p == NULL 時可能評估為 false,導致邏輯錯誤。現代標準(C++11 起)已規範 NULL 為 0,但為了極致可移植性,建議顯式比較 p == nullptr (C++11) 或 p == NULL。

現代 C++ 最佳實踐

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)需包含標準頭文件
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved