なぜ NULLが0でなければならないか?
if( ptr != NULL ) つまり if (ptr) に最適化される命令のアセンブラ展開は
test eax,eax;
je label;
に展開されるが
if( ptr != 1 ) つまり 0以外への比較のアセンブラ展開は
cmp eax,1;
je label;
に展開される。test 命令は実質 AND命令 論理積 であるが CMP命令は実質比較演算子。
今は どちらも 1サイクル未満の命令なので どうでもいいことではあるが 当たり前だが CMPよりTEST命令のほうが 軽いので
CPUへの負荷をきにして、歴史的経緯で 0 が採用されている。
また、NULLは初期値になることが多く 0 にしておいたほうがメモリ的にもお得。
さらに言えば if( ptr != NULL ) は 本来 cmp eax,0に展開されるべきだが(最適化を無視すれば) if( ptr ) は 正しく test eax,eax を意味している。 つまり、 意味論的には、 if( ptr != NULL ) ...