NULLポインター

読み:ヌルポインター
読み:ナルポインター
外語:null pointer 英語
品詞:名詞

無効である、空のポインター。CのJIS規格では「空ポインター」と書かれている。

目次

ポインターは、メモリーやオブジェクトの参照に必要な概念のため、Cやその系統の言語を始め、多くの言語で用いられている。

この時、ものを指している状態の他に、何も指していない状態が表現できないと、何かと不便である。そこで、この何も指していないポインターを用意し、これをNULLポインターとする。

内容

C/C++の言語標準は、「どのようなオブジェクト、関数へのポインターと比較しても等しくならないことを保証する」ことを求めている。

つまり、参照演算子&の結果がNULLポインターになることは絶対になく、またmalloc関数が成功した際に、その戻り値が偶然NULLポインターと一致することもない。

なお、NULLポインターは「初期化されていないポインター」とも違う。初期化されていないポインターはどこを指しているか不明で、内容も未定義である。対してNULLポインターは、アドレス以外の意味を持つように明確に定義されている。

アドレス

ポインターの内部処理は実装によるが、「マイクロプロセッサーの利用できるメモリーアドレスのどこか」、つまり物理アドレス論理アドレスが用いられることが多い。

その上で、使用されないどこかのメモリーアドレスをNULLポインターとして利用するように実装されることになる。

現実には「0番地」を使う実装が多い。

この時、数値の0をvoid *型キャストしたもの、すなわち「(void *)0」を「NULLポインター」という。

特徴

Cの標準規格では、NULLというマクロ定数が定義されており、キャストの差はあれ、値としては0が定義されていることが多い。

次のように使うことが出来る。

char *p = NULL;

if (!p) { … /* if (p==0) と等価 */

世の中には様々なマイクロプロセッサーがあり、現実にNULLポインターの内部表現が「0番地」では無いものも存在する。

しかしこの場合でも、ソースコード中の値は0のままで良い。なぜなら、NULLポインターというものは抽象的な概念であり、物理的なアドレスを指しているわけではないからである。

もし内部表現が0でない計算機の場合、必要に応じてCコンパイラーはその値に自動的に変換してくれる。従って、NULLポインターと0は完全に等価であり、可換であるとして扱うことが出来るのである。

C++

C++でも、Cと同様にNULLというマクロ定数が定義されている。しかし、C++は型チェックが厳密化された結果、Cのように「(void *)0」を使うことは出来ない。

C++の場合はvoid *型と他の型は明確に異なるため、代入しようとしても「void *を、他の型のポインター変数に代入できない。」といった趣旨のエラーを出してしまうからである。

しかし、型ごとにNULL相当のマクロを用意することは現実には不可能である。やむを得ずC++は、ポインターの値として数値0は「どこも指し示さない」という意味として定義し、もってコンパイラーは次のように定義することになった。

#define NULL 0

こうなるともはや、ポインターと数値の区別は不可能であり、この点においてC++は、Cより「退化した」と言うことができる。

しかし、ISO/IEC 14882:2011(C++11)からnullptrを追加し、この問題は解決された。

関連する用語
ポインター
null
NullPointerException
SIGSEGV

コメントなどを投稿するフォームは、日本語対応時のみ表示されます


KisoDic通信用語の基礎知識検索システム WDIC Explorer Version 7.04a (27-May-2022)
Search System : Copyright © Mirai corporation
Dictionary : Copyright © WDIC Creators club