ヌルポインタ
C言語では、すべての型の2つのヌルポインタは等しいことが保証されていない。マクロ NULL が処理系定義のヌルポインタ定数と定義されている。C89 (ISO/IEC 9899:1990) や C99 (ISO/IEC 9899:1999) では、NULL はヌルポインタ定数を表現する物として定義され、ヌルポインタ定数は整数定数の 0 もしくは 0 を汎用ポインタ void * に型キャストしたものとして定義されている。C言語における汎用ポインタ型はあらゆるポインタ型に暗黙的変換可能となっているため、ポインタ型変数にNULLを代入する際は型キャストの記述が不要となる。POSIX.1-2008 では整数定数の 0 ではなく、0 を void * に型キャストした物、(void *) 0 でなければならないと定義していて、rationale にて、整数の 0 ではあってはならないと、その定義の差を明記している。よって、ほぼ全ての標準Cライブラリは NULL を (void *) 0 としている。そして、C89, C99 では、ヌルポインタ定数を、(void * 以外を含めた)ポイント型に型キャストした物をヌルポインタと定義している。ほとんどの実装はそのまま変換するが、C89, C99 の仕様では、整数からポインタ、ポインタから整数への型キャストがどのような結果になるかは実装依存と明記されていて、ポインタに 0 や NULL を代入したときに、ほとんどのコンパイラは数値の 0 を代入したというコンパイル結果を生成するが、数値の 0 以外を代入するというコンパイル結果を生成しても良いという仕様になっている。