注:この回答は、C ++ではなくC言語に適用されます。
ヌルポインター
整数定数リテラル0
は、それが使用されるコンテキストに応じて異なる意味を持ちます。いずれの場合も、値は整数定数であり0
、さまざまな方法で説明されています。
ポインターが定数リテラルと比較されている場合、0
これはポインターがnullポインターかどうかを確認するチェックです。これ0
は、NULLポインター定数と呼ばれます。C標準では0
、型へのキャストvoid *
はnullポインターとnullポインター定数の両方であると定義されています。
さらに、読みやすくするために、マクロNULL
はヘッダーファイルで提供されますstddef.h
。コンパイラによっては、#undef NULL
奇抜なものに再定義できる場合があります。
したがって、ヌルポインターをチェックするいくつかの有効な方法を次に示します。
if (pointer == NULL)
NULL
nullポインタと等しいと比較するように定義されています。これはNULL
、有効なnullポインター定数である限り、実際の定義が何であるかを定義した実装です。
if (pointer == 0)
0
NULLポインター定数の別の表現です。
if (!pointer)
このif
ステートメントは暗黙的に「is not 0」をチェックするので、「is 0 "を意味するように逆にします。
以下は、ヌルポインターをチェックする無効な方法です。
int mynull = 0;
<some code>
if (pointer == mynull)
コンパイラにとって、これはnullポインタのチェックではなく、2つの変数の等価チェックです。これは、mynullがコードで変更されず、コンパイラー最適化定数が0をifステートメントに折りたたむ場合に機能する可能性がありますが、これは保証されず、コンパイラーはC標準に従って少なくとも1つの診断メッセージ(警告またはエラー)を生成する必要があります。
C言語でのnullポインターとは何ですか。基盤となるアーキテクチャには関係ありません。基盤となるアーキテクチャにアドレス0xDEADBEEFとして定義されているnullポインター値がある場合、この混乱を取り除くのはコンパイラー次第です。
そのため、このおかしいアーキテクチャでも、次の方法はnullポインターをチェックする有効な方法です。
if (!pointer)
if (pointer == NULL)
if (pointer == 0)
以下は、ヌルポインターをチェックする無効な方法です。
#define MYNULL (void *) 0xDEADBEEF
if (pointer == MYNULL)
if (pointer == 0xDEADBEEF)
これらは通常の比較としてコンパイラによって見られるので。
ヌル文字
'\0'
ヌル文字として定義されています-つまり、すべてのビットがゼロに設定された文字です。これはポインタとは関係ありません。ただし、次のようなコードが表示される場合があります。
if (!*string_pointer)
文字列ポインタがnull文字を指しているかどうかを調べます
if (*string_pointer)
文字列ポインタがnull以外の文字を指しているかどうかを調べます
これらをnullポインターと混同しないでください。ビット表現が同じであり、これによりいくつかの便利なクロスオーバーケースが可能になるという理由だけで、それらは実際には同じものではありません。
さらに、'\0'
(すべての文字リテラルと同様に)は整数定数で、この場合は値がゼロです。つまり'\0'
、装飾されていない0
整数定数と完全に同等です。唯一の違いは、それが人間の読者に伝える意図です(「これをnull文字として使用しています」)。
参考文献
詳細については、comp.lang.c FAQの質問5.3を参照してください。C規格については、このPDFを参照してください。セクション6.3.2.3ポインタ、パラグラフ3を確認してください。