【C言語】
¥0は[ヌル文字(NULL文字)]ではなく[終端文字¥0]と書こう

warning: comparison between pointer and zero character constant

警告:ポインタと終端文字’\0’との比較
[-Wpointer-compare]

■1.ポインタと終端文字\0を比較するの誤り

#include    <stdio.h>
void    ng(char *p)
{
        if(p == NULL)   {
                printf("NULLポインタ\n");
                return  ;    
        }
        if(p == '\0') {//NG:ポインタと終端文字¥0との比較
                printf("空文字列\n");
                return  ;    
        }
}
int main(void)
{
        ng("")   ;
        ng(NULL) ;
}

ポインタと終端文字¥0を比較するのは多くの場合誤りです。
if( p == ‘\0’)  // 「ポインタが終端文字\0」 ではなくて
if( p == NULL) // 「ポインタがNULLポインタ」か
if(*p == ‘\0’) // 「ポインタの指す先が終端文字\0」 の
どちらかでしょう。


■2.標準をローカル表現に再定義すると混乱

#define   ZERO              0U
#define   EOS               '\0'   //end of  string 
#define   NULLPTR           NULL
#define   NULLSTRING        ""

0,NULL,’¥0’,””の使い分けができない場合が多いので
プロジェクトによってはこのような再定義をする場合があります。

しかし教科書にのっている表現をわざわざローカルな表現にすると
かえって混乱するので避けたほうが良いでしょう。


■3.発音と表記の提案

聖典 プログラミング言語C石田晴久訳では’¥0’をヌル文字と訳されていますが、ちまたではNULL文字、NULL終端文字と表記される場合が非常に多いため、初心者はNULLと’\0’を混同してしまいます。
そこで提案ですがソースコードレビューやコード中のコメントには以下のようにすると混乱しないと思います。
NULL
   表記:NULLポインタ 
   発音:ぬるぽいんた
’¥0’ 
   表記:終端文字¥0 
   発音:しゅうたんもじえんぜろ
   または
   発音:しゅうたんもじぎゃくすらぜろ 


参考:

C-FAQ5: ヌルポインター

http://www.kouno.jp/home/c_faq/c5.html

■4.クイズ

39
メモリ上にアドレスを持つのは次のどれでしょうか?

●クイズのヒント(コンパイルエラーにならないのはどれ?)

#include <stdio.h>
int main(void){
    printf("%p\n",&NULL);
    printf("%p\n",&'\0');
    printf("%p\n",&"");
    printf("%p\n",&0);
}