プログラミングでは,時として「なーんにもない」ことを表す記号に遭遇する。おそらく,多くの人は特に気にとめることなく,それらを扱っているだろう。

 ご存じの通り,コンピュータはどんなプログラムであれ,最終的に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に相当する。

表1●ASCIIコード表。文字0はASCIIコードで48という値を持つ。値が0の文字はNULで表す
表1●ASCIIコード表。文字0はASCIIコードで48という値を持つ。値が0の文字はNULで表す

NULLは0番地を示す,実体は数値0

 NULは“NULL”を略したものである。研究社の新英和中辞典では,NULLについて以下のように解説されている。

1 (法律上)無効の.
2 価値のない.
3 【数】ゼロの,零の.

 ということで,NULLは数学で用いる0と同じ意味である。実際,Cの多くの処理系は,NULLを数値の0と定義している。NULLを使用する場面としてよく知られているのが,ポインタを返す関数でエラーを知らせる戻り値としての利用だ。

 例えば,ファイルを開く関数fopenは,処理に成功するとそのファイルにアクセスするためのファイル・ポインタ(FILE構造体へのポインタ)を返す(図1(a))。一方,処理に失敗した場合には,NULLを返す(b)。ポインタはメモリー上の場所(アドレス)を指し示すデータである。ファイルを開く処理に失敗した場合に返すNULLは,有効なFILE構造体が生成されなかったために「指し示す場所がどこにもない」ことを表している。

図1●関数の戻り値のNULLも実体は0
図1●関数の戻り値のNULLも実体は0
[画像のクリックで拡大表示]