プログラミングでは,時として「なーんにもない」ことを表す記号に遭遇する。おそらく,多くの人は特に気にとめることなく,それらを扱っているだろう。
ご存じの通り,コンピュータはどんなプログラムであれ,最終的に0と1の二つの値しか持たない2進数で処理を進めている。だったら「なーんにもない」状態は,一律に0としてもよさそうだ。なのに,CにはNULLやら\0,さらに空っぽの文字列""など異なる表記が存在する。
そんなわけで,今回は「なーんにもない」状態について調査した。
数値0は量がない値。文字'0'とは違う
Cの代表的な「なーんにもない」と言えば,「数値の0」「NULL」「\0」だ。それぞれ,どのように違うのだろう?
まずは数値の0である。これは,ご存じのように「量がないことを表す値」だ。数はそもそも,“存在する”量を表すために用いられてきた。その数に,“存在しない”すなわち量がないことを表す機能を持たせた0の発見は,数学的にも哲学的にもすごいことだった。
プログラムに数値計算は付きもの。当然,通常の数値として0を用いる機会は多い。が,この0というヤツ,プログラムの中では単純な数値としての0とは異なった扱いをされることがある。
ここで言っている0は,もちろん文字の'0'ではなく,値としての0である。ASCIIコード表(表1)を見ると,文字'0'は16進数の30h(10進数では48)という量を持つ値であることがわかる。値0は,ASCIIコード表の先頭(左上隅)にあるNULに相当する。

NULLは0番地を示す,実体は数値0
NULは“NULL”を略したものである。研究社の新英和中辞典では,NULLについて以下のように解説されている。
1 (法律上)無効の.2 価値のない.
3 【数】ゼロの,零の.
ということで,NULLは数学で用いる0と同じ意味である。実際,Cの多くの処理系は,NULLを数値の0と定義している。NULLを使用する場面としてよく知られているのが,ポインタを返す関数でエラーを知らせる戻り値としての利用だ。
例えば,ファイルを開く関数fopenは,処理に成功するとそのファイルにアクセスするためのファイル・ポインタ(FILE構造体へのポインタ)を返す(図1(a))。一方,処理に失敗した場合には,NULLを返す(b)。ポインタはメモリー上の場所(アドレス)を指し示すデータである。ファイルを開く処理に失敗した場合に返すNULLは,有効なFILE構造体が生成されなかったために「指し示す場所がどこにもない」ことを表している。