2016-07-11 32 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

這是爲了防止不正確地解引用一個空指針的方法的字符串。 &&短路,所以如果'ptr'爲NULL''ptr'永遠不會嘗試(如果有的話,它會發生段錯誤)。 –

+1

你確實知道你可以解引用(使用解引用運算符'*')一個'NULL'指針嗎?你知道邏輯運算符'&&'和'||'做[short-circuit evaluation](https://en.wikipedia.org/wiki/Short-circuit_evaluation)嗎?你知道'NULL'指針被認爲是「false」?你知道字符串以零結尾嗎?而且任何非零的東西都被認爲是「真的」?如果你知道所有這五件事情,那麼把這些知識放在一起,再多思考一下。 –

+0

不要在C++中使用指針。這不再是1995年。您正在閱讀的代碼非常陳舊。 –

回答

6

這意味着該指針應指向的東西,在另外的東西必須從0

不同這就像(a_pszBreak != nullptr && a_pszBrealk[0] != '\0')

0
if (a_pszBreak && *a_pszBreak) 

在C++中,任何可以被解釋爲0是錯誤的,並且爲了陳述的目的,其他任何事情都被認爲是真的。

因此,這確保了指針不NULL和第一元素的內容的指針所指向的是不或0任一。

由於短路,如果指針NULL,則不檢查第二部分。

所以用簡單的英語,這個if語句來檢查是否指針不是nullptr如果指針未指向空字符串。

0

if (a_pszBreak && *a_pszBreak)a_pszBreak是用來檢查是否a_pszBreak指向有效的存儲區即a_pszBreak不爲NULL並且*a_pszBreak用來檢查是否內存a_pszBreak指出不以NULL字符即\0開始。

總之if (a_pszBreak && *a_pszBreak)用於檢查是否a_pszBreak點長度ATLEAST 1.

+0

實際上'if(a_pszBreak)'不能保證指針是有效的,只有它不是'nullptr'才能保存地址。這個地址是否有效是另一回事。 – Jack