2016-07-11 8 views
1

私はC++コードを探していて、if(ptr && *ptr)で混乱していましたが、この場合はどうなりますか?C++のif文でポインタとその逆参照を使用する理由

// Process the data here. We just break the data into separate pieces and 
// display it for the sake of simplicity. 
char * a_pszBreak = NULL; 
char * a_pszDataItem = (char*)s_aucDataBuffer; 
do 
{ 
    // The poll data is terminated by either a Carriage Return alone, or a 
    // Carriage Return/Line Feed pair. 
    a_pszBreak = strpbrk(a_pszDataItem, "\n\r"); 
    if (a_pszBreak && *a_pszBreak) 
    { 
     *a_pszBreak = 0; 
     a_pszBreak++; 
     LogPollData((const char *)a_pszDataItem); 
    } 
    a_pszDataItem = a_pszBreak; 
} while (a_pszBreak && *a_pszBreak); 
+0

の列にa_pszBreak点はそれが間違ってNULLポインタを参照解除防止する方法ですかどうかを確認するために使用されます。 &&は短絡です。したがって、 'ptr'がNULLの場合、' * ptr'は実行されません(もしあれば、それはsegfaultになります)。 –

+1

あなたは(間接参照演算子 '*'で) 'NULL'ポインタを逆参照できることを知っていますか?そして論理演算子 '&&'と '||'は[短絡評価](https://en.wikipedia.org/wiki/Short-circuit_evaluation)をしていることは知っていますか?そして、あなたは 'NULL'ポインタが" false "とみなされることを知っていますか?そして文字列はゼロで終了することがわかりますか?そして、ゼロ以外のものは「真」とみなされますか?あなたがこれらの5つのものすべてを知っているなら、その知識をまとめて、もう少し考えてみてください。 –

+0

C++でポインタを使用しないでください。もはや1995年ではありません。あなたが読んでいるコードは古くからあります。 –

答えて

6

それはポインタは何かを指している必要がありますことを意味し、何かが0

異なっていなければならないことに加えて、それは、C++、と解釈できるもので(a_pszBreak != nullptr && a_pszBrealk[0] != '\0')

0
if (a_pszBreak && *a_pszBreak) 

ようなものです0は偽であり、文の目的のために他のものは真とみなされます。

これはポインタがNULL ではなく、最初の要素のコンテンツポインタポイントはいずれかヌルまたは0ではないために、そのことを確実にします。

短絡のため、ポインタNULLの場合、2番目の部分はチェックされません。平易な英語、このif -statementチェック中のSO

ポインタが空の文字列を指していない場合、ポインタはnullptrない場合。 if (a_pszBreak && *a_pszBreak)a_pszBreak

0

a_pszBreakすなわち、有効なメモリ領域へのa_pszBreakポイントがNULLではないと*a_pszBreaka_pszBreakが指すメモリはNULL文字すなわち\0で始まっていないかどうかを確認するために使用されているかどうかをチェックするために使用されます。短いif (a_pszBreak && *a_pszBreak)

は、長さ少なくとも1

+0

実際に 'if(a_pszBreak)'はポインタが有効であることを保証するものではなく、 'nullptr'ではないので実際にアドレスを保持します。そのアドレスが有効かどうかは別の話です。 – Jack

関連する問題