ア | イ | ウ | エ | オ |
カ | キ | ク | ケ | コ |
サ | シ | ス | セ | ソ |
タ | チ | ツ | テ | ト |
ナ | ニ | ヌ | ネ | ノ |
ハ | ヒ | フ | ヘ | ホ |
マ | ミ | ム | メ | モ |
ヤ | ユ | ヨ | ||
ラ | リ | ル | レ | ロ |
ワ | ヰ | ヴ | ヱ | ヲ |
ン |
A | B | C | D | E |
F | G | H | I | J |
K | L | M | N | O |
P | Q | R | S | T |
U | V | W | X | Y |
Z | 数字 | 記号 |
無効である、空のポインター。CのJIS規格では「空ポインター」と書かれている。
ポインターは、メモリーやオブジェクトの参照に必要な概念のため、Cやその系統の言語を始め、多くの言語で用いられている。
この時、ものを指している状態の他に、何も指していない状態が表現できないと、何かと不便である。そこで、この何も指していないポインターを用意し、これをNULLポインターとする。
Cの標準規格では、NULLというマクロ定数が定義されており、キャストの差はあれ、値としては0が定義されていることが多い。
次のように使うことが出来る。
char *p = NULL;
if (!p) { … /* if (p==0) と等価 */
世の中には様々なマイクロプロセッサーがあり、現実にNULLポインターの内部表現が「0番地」では無いものも存在する。
しかしこの場合でも、ソースコード中の値は0のままで良い。なぜなら、NULLポインターというものは抽象的な概念であり、物理的なアドレスを指しているわけではないからである。
もし内部表現が0でない計算機の場合、必要に応じてCコンパイラーはその値に自動的に変換してくれる。従って、NULLポインターと0は完全に等価であり、可換であるとして扱うことが出来るのである。
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を追加し、この問題は解決された。
コメントなどを投稿するフォームは、日本語対応時のみ表示されます