2016-09-30 146 views
-1

我目前正在學習C++。不在學校。使用書籍,教程和練習。何時使用解除引用運算符指針C++

有一件事讓我感到困惑,而我一直無法追蹤答案是何時使用解除引用操作符(*)作爲指針。例如,從C++底漆,我目前正在讀:

char *cp = get_string(); 
if (cp) /* ... */ // true if the pointer cp is not zero 

while (*cp) /* ... */ // true if *cp is not the null character 

我不明白爲什麼if語句是沒有引用操作只是CP,然後在while語句,它使用了引用操作。還有其他一些例子,如for循環中的混合使用,但這是本書中最新的例子,使我感到困惑。在此先感謝您的幫助。總結:什麼時候你只需要使用指針的變量名而不需要取消引用,以及何時使用它的引用。以及如何區分差異。

+4

答案就在你的代碼中的註釋.. – HazemGomaa

+0

@HAG ,我不在學校,我正在努力學習,所以我不完全理解它的含義,但是感謝對初學者的低調,因爲我不明白。我認爲這裏張貼的目的是如果我需要幫助。你可能很容易理解這些評論意味着什麼,但我確定當你第一次開始的時候,在某些方面也讓人感到困惑。 – MKSnazzy

+0

我沒有downvote!然而,我認爲你可以通過簡單的在線搜索找到答案..有大量的土族可以幫助你根據你的要求。這可能就是爲什麼你的問題是downvoted ... – HazemGomaa

回答

1

指針是一個變量,其值是另一個變量或對象的地址。我們說指針「指向」那個對象。

寫入表達式時,cp表示指針變量。 *cp表示指針變量保存的變量或對象。

試着保持清晰的「指針」和「被指向的東西」之間的區別。這是兩個截然不同的東西,每個都有自己的生命週期和存儲需求。

因此,要解決您的問題中的代碼,if (cp)正在測試指針。它是​​的簡稱,即指針是否設置爲指向某處? (換句話說,指針當前是否保存另一個對象的地址?)

if (*cp)表示if (*cp != 0),它詢問地址存儲在指針中的對象的值(換句話說,對象被指向)。

+0

因此,沒有取消引用就是看它是否實際指向一個對象,並且取消引用是比較該對象的實際值? – MKSnazzy

+0

@Matt這是正確的。 – gowrath

+1

@Matt好吧,這取決於你對錶達式做了什麼。要理解的是'cp'指向指針,'* cp'指向指向的對象。 (這兩件事都是「實際價值」)。然後,你可以繼續比較某些東西,或者分配給他們,或者添加或者其他任何東西 –

0

區別很簡單,但需要習慣習慣。實質上,解引用操作符用於處理指針實際指向的內容(即實際位於指針末尾的內容)。

因此,例如,如果我有一個char *cp = get_string();,那麼cp是一個指向字符數組中第一個字符的指針。

檢查類似if(cp)的內容是檢查指針是否爲0(即指針是否指向NULL)。如果get_string()成功,則返回指向字符串的指針,如果出錯則返回NULL

相比之下,類似while(*cp)這樣的說法是,雖然cp指向的字符不是0(空字符\ 0),然後繼續循環。在此背景下,while循環可能看起來像:

while(*cp) { 
    // process letter currently pointed to by cp 
    cp++; // advance cp to point to the next character. 
} 

這是一個常見的成語通過一個字符數組進行迭代。

+0

爲什麼你把指針放在括號裏,後綴增量在外面? – MKSnazzy

0

我不認爲像這樣寫這兩個測試是好的做法。爲了清楚起見(這是你問的問題)它們應該是:

if(cp == nullptr) // or `cp == NULL` 
    ... 
if(*cp == '\0') 
    ... 
+0

我只是在學習不想製作一個程序。我試圖理解基本面。 – MKSnazzy

+0

約定避免'if(cp == NULL)'冗餘。這就像寫'if(condition == True)';它被認爲是過度的。 – gowrath

+0

@Matt我的意思是,第一種情況檢查指針_的無效性,第二種情況檢查指向字符的無效性。如果你使用空指針來執行'* cp',你會導致分段錯誤,因爲它不是有效的內存地址。 –

1

此圖解釋了這個概念。 enter image description here

指針變量總是存儲另一個變量的地址。在數組的情況下,它將第一個元素的地址存儲在數組中。

解引用操作符引用由特定指針變量存儲的地址中的值。 在上面的例子中,存儲在指針變量ptr中的地址是1001. *(ptr)應該給出存儲在地址位置1001中的值,該地址位置是變量var的內容,也就是50.

總之,要檢查指針變量是否指向某個地址位置,如果使用不帶解除引用操作符的變量,並且想要處理存儲在指針變量中存儲的地址位置中的值,請將其與解除引用運算符

在你的例子中,首先檢查指針是否通過語句指向一個字符串

if(cp) 

然後,它檢查是否變量的內容它的指針是非零(可能是爲了檢查字符串的結尾)由語句

while(*cp) 
+0

謝謝你的幫助。 – MKSnazzy