NULL と '\0' の違い

せりか式 - C 言語チュートリアル - NULL と '\0' の違い

NULL と '\0' の違い

ほとんどの人が "ヌル" と聞くと "NULL" を思い出すと思います。
しかし、プログラム中では NULL と '\0' の2種類あります。

プログラム中で使っている NULL とは何でしょう?
用語的には "ヌルポインタ" と呼ばれています。
では、'\0'は何でしょう?
こちらは "ヌル文字" と呼ばれています。

名前からもわかるように、この二つは "ポインタ" と "文字" の違いがあります。
'\0'が0であることに対し、NULLはstdio.hの中で次のように定義されています。

    1:#define NULL    ((void*)0)
つまり、完全なポインタとなっています。

ここで、文字列を思い出してください。
文字列の最後は "ヌル文字" であったはずです。
多くの人が文字列の終端を探すために次のような文で判断していると思います。
人によっては文字列の終端を探すために次のような分で判断していることがあります。

    1:while(string[i] != NULL)
    2:  i++;
これは、"文字"という""と、"NULL"という"ポインタ"を比較しています。
実際は多くのコンピュータでは '\0' も NULL も同じ値(ビットフィールドがすべて 0 である)として扱われているため正しく動作しますが、 正確に文法をチェックすると間違ったプログラムとなります。(コンパイラによってはWarningを出します。)
(コンピュータによっては、NULLをビットフィールドをすべて 0 としていないものもあるようです)
正しいプログラムは次のようになります。
    1:while(string[i] != '\0')
    2:  i++;

最後にまとめておくと
NULL: ポインタが 0 であるか判断する
'\0': 値が 0 であるか判断する
ときに使うものです。
この二つがごっちゃにならないように気をつけてください。

ただし、C++ではこの違いは吸収されたらしく

    1:#define NULL    0
と定義されています。(というより,もともとC言語は0をポインタ型として自動的にキャストするように保障されていたのですが)


トップへ