恐れ入ります。
hyenaydtekieさんがすでに質問の中に書いておられますが、NULLとは概念そのものです。
その概念とは、(No.2の方も書いておられますが)『空っぽである』という事です。ナニかが空っぽである事を明示するために、NULLという概念が用いられます。
・空文字(null character)
『「文字が入っていない」という事を示す文字』の事です。
なぜ必要かというと、プログラミング言語が変数に値を入れて計算するからです。
例えば、
『[box]という名前の変数にはアルファベット1文字を入れること』と決めたとします。
このとき、[box]の中には a が入っていても良いし b が入っていても良いです。
でも、プログラムでは時に『[box]の中に何も入っていないときだけ、その中にアルファベットを入れたい』という要求が生じます。
このとき、例えば z が入っていたら、何も入っていないことにしようということにして、[box]に z を入れておいて、チェックすることはできます。でも、そうすると z が入ったときにアルファベットが入った、と判定できなくなってしまいます。
変数には何かを入れて処理を行いますが、『変数の中には何も入っていない』というのを表したいことがあるから、空文字(null character)はあるわけです。
・空ポインタ(null pointer)
こちらも空文字とほぼ同じです。
ポインタとは、「変数の番地を表す変数」の事ですので、本質的には空文字となんら変わりがありません。
空文字の所でだいぶ丁寧に説明しましたので、null pointerは別に「z」でも良いし、「123」でも良いし、「0」でも良いのはわかると思います。
単に「このポインタは、どの変数の番地も表していない」という事がわかれば良いからです。(その取り決めは言語・実装毎に異なります)
・空文(null statement)
「何もしない文」という意味です。主に二つの需要から生まれました。
1.見栄え
2.コンパイラが混乱するから
if (10 > i) {
;
} else {
i = i - 10;
}
この場合、見栄えをそろえるために上のifブロックの中に;だけ入れてあります。これがC言語における空文です。
if (10 > i) {} else { i = i -10; }
とか書くと、構文解析に失敗するコンパイラがあったからというのも理由の一つです。(普通はこんな変なif文を書いたりしませんが)
混乱しがちですが、「何も入ってない」「何も指し示さない」「何もしない」という、「空っぽである」という定義がnullです。
『何もデータが入っていないときだけ、データを入れよう』
『このポインターはもう使わないから、ちゃんと使っていないと表現したい』
『ここは別に何もしないブロックだと書いておこう』
、そんな需要から生まれたのが、nullです。
***
なお、実装(どうその定義が表現されているか)は、プログラミング言語によってまちまちです。
JIS規格で決まってるC言語のNULLの定義をよく見ると、たまに矛盾してて面白いですよ。
お礼
ありがとうございます