此條目介紹的是以各種程式語言為基礎介紹Null Pointer的概念。关于C++11語言標準的關鍵字，请见「**nullptr**」。
在程式語言中，**空指標**（英語：）是一個已宣告但並未指向一個有效物件的指標，許多程式利用空指標來表示某些特定條件，例如未知長度陣列的結尾或某些無法執行的操作。在可選擇型態（optional type）的程式語言中，空指標通常可以跟可為Null的型別（Nullable types）和空值（Nothing value）進行比較。

空指標與未初始化的（英语：）指標（uninitialized pointer）不同，空指標保證不會和有值的指標相等，而未初始化的指標則是要看所使用的程式語言或編譯器而定，在部分程式語言環境下，未初始化的指標無法保證不與有值的指標相等，他可能因為存有記憶體殘值而指向了某個有效物件。

空參照
---

在程式語言中，空參照（英語：）是一個與空指標類似的概念，是一個已宣告但其並未參照到一個有效物件的變數。東尼·霍爾在1965年發明了空參照，並作為ALGOL W程式語言的一部分。

歷史
--

查爾斯·安東尼·理察·霍爾（C. A. R. Hoare）在2009年表示他在1965年發明了空參照，並且將這項發明描述為"十億美元的錯誤"。

程式語言中的空指標
---------

### C語言

在C語言中，任何2個空指標都保證是相等的，其是由預處理器的巨集提供，即NULL，其被定義為用來表示空指標的常數值，在C99是透過隱含轉換或直接轉換成void\*的整數值0來使用。

在C语言中，空指针的值表示为`#define NULL (void *)0`。

C語言標準並沒有規定記憶體位置0與空指標相同，隨然實際上記憶體位置0與空指標在大部分的情況下會是相同的。對空指標取值在C語言中是一個未定義行為，在實作上，取值時必須確保所取的指標不為空。

### C++語言

在C++語言中，同樣有繼承自C語言的NULL巨集可供使用，但在傳統上會優先使用整數零來表示空指標常數。在C++11標準中已明確的引入一個常數（部分編譯器視之為關鍵字，如Visual Studio）nullptr做為表示空指標的常數。

nullptr
-------

条目：nullptr
nullptr是C++11語言中的關鍵字，在C++11語言標準用來表示空指標的常數值。其型態為nullptr\_t。

取值
--

因為空指標沒有指向有效的物件，所以若嘗試取值（Dereference，即，從該記憶體位置取出數值）的話，有機率導致程式執行時發生錯誤或立即崩潰。

* 在C語言中，對空指標取值是一個未定義行為。許多實作對空指標取值的案例都會導致程式因為segmentation fault而當機或停止運作，因為空指標通常表示選擇了一個不是由系統分配的儲存空間，但是並非每次都會出現這種情況。
* 在Java語言中，若嘗試從空指標的物件中取值則會觸發NullPointerException（NPE），由於會觸發錯誤，因此可以使用例外處理的程式碼來捕捉，但編程上仍要儘量確保永遠不會發生此錯誤為佳。

### NullPointerException

主條目：NullPointerException（日语：）
空指標錯誤是一種常見的程式錯誤，當嘗試存取空指標所指向之物件時，就會發生**NullPointerException**，通常是因為物件未順利初始化或者提前解構而造成。空指標錯誤常常出現在類別設計或管理上有缺陷的程式中，一旦出現了空指標錯誤經常會導致程式當機或崩潰。而在部分程式語言中，則有NullReferenceException（空參照錯誤），例如.Net平台。

在Java中，NullPointerException被定義在java.lang.NullPointerException（日语：），是一種執行階段錯誤（java.lang.RuntimeException）。

參見
--

* 記憶體除錯（英语：）
* 零号分页（英语：）

參考文獻
----

1. ↑ . 國家教育研究院.  [2018-09-08]. （原始内容存档于2018-09-09）.
2. 1 2  Tony Hoare.. InfoQ.com. 2009-08-25  [2018-09-08]. （原始内容存档于2018-09-04）.
3. 1 2  Joint Technical Committee ISO/IEC JTC 1, Subcommittee SC 22, Working Group WG 14.  (PDF; Committee Draft). 2007-09-08  [2018-09-08]. （原始内容存档 (PDF)于2018-06-24）.
4. ↑  ISO/IEC 9899, clause 6.3.2.3, paragraph 4.
5. ↑  ISO/IEC 9899, clause 7.17, paragraph 3: *NULL... which expands to an implementation-defined null pointer constant...*
6. ↑ .  [2018-09-09]. （原始内容存档于2018-09-09）.
7. ↑  Stroustrup, Bjarne..  14th printing of 3rd. United States and Canada: Addison–Wesley. March 2001: 88. ISBN 0-201-88954-4. In C, it has been popular to define a macro `NULL` to represent the zero pointer. Because of C++'s tighter type checking, the use of plain 0, rather than any suggested `NULL` macro, leads to fewer problems. If you feel you must define `NULL`. use  
    `const int NULL = 0;`  
The `const` qualifier (§5.4) prevents accidental redefinition of `NULL` and ensures that `NULL` can be used where a constant is required.
8. 1 2   (PDF). stroustrup.com. 2003-09-10  [2018-09-09]. （原始内容 (PDF)存档于2017-07-05）.
9. ↑ . docs.oracle.com.  [2018-09-08]. （原始内容存档于2018-09-10）.
10. ↑ . 曼徹斯特大學電腦科學系.  [2018-09-09]. （原始内容存档于2018-03-25）.
11. ↑ . ithome.com.tw.  [2018-09-08]. （原始内容存档于2018-09-09）.
12. ↑ . msdn.microsoft.com.  [2018-09-08]. （原始内容存档于2018-09-09）.

|  |  |  |  |  |  |
| --- | --- | --- | --- | --- | --- |
| 

| * 
* 论
* 编
程式語言中的空值 |
| --- |
|  |
| 
* 空字元
* 空裝置
* 空函數（英语：）
* 空对象模式
* 空指標
* **空參照**（章節）
* SQL的空值
* 空字元串
* 空值结合运算符

 |
|  |
| 
* 另見： 可為空型態（英语：）
* 未定義的值（英语：）

 |

 |