2017-02-21 27 views
-2

示例代碼:這個特殊的指針增量在C++中是如何工作的?

int arr[] = {1,9,3,4}; 
int *myarr; 

//Scenario 1 
myarr = &arr[0]; 

cout<<"array at [0] "<< *myarr <<endl; 

*myarr++; 

cout<<"array at [1] "<< *myarr <<endl; 

//Scenario 2 

myarr = &arr[0]; 

cout<<"array at [0] "<< *myarr <<endl; 

myarr++; 

cout<<"array at [1] "<< *myarr <<endl; 

//Scenario 3 

myarr = &arr[0]; 

cout<<"array at [0] "<< *myarr <<endl; 

(*myarr)++; 

cout<<"array at [1] "<< *myarr <<endl; 

我能理解情景3語句。但不是myarr ++和myarr ++是如何工作的。

使用的代碼塊執行上述語句。

輸出如下:

array at [0] 1 
array at [1] 9 
array at [0] 1 
array at [1] 9 
array at [0] 1 
array at [1] 2 

編輯:我已經編輯刪除註釋和補充說明。造成混淆的道歉

+0

倒數第二行不打印2.然後,由於出界限訪問,下一行是未定義的行爲。 –

+0

@ M.M其實沒有。該行傳遞一個指向運算符<<的指針。 –

+0

@DannyuNDos修改註釋 –

回答

0

前兩次你增加指針myarr。這意味着您首先打印元素0,然後打印元素1.第三次將指針myarr而不是指針本身的值遞增,然後再次打印該元素(但現在增加1)。

這是因爲myarr++*myarr++做同樣的事情 - 增量myarr。第二個也取消它的引用,但你忽略了它的價值。 (*myarr)++首先明確解除引用,然後遞增解除引用的指針 - 即它指向的值,而不是指針。

+0

感謝您的澄清。你認爲在myarr ++和* myarr ++(使用解引用操作符)這兩種語言都是同樣的東西的時候,它在語言中是一種不和諧的東西嗎? – john

+0

不是真的 - 它是相同的語句,優先級規則說'++'比* *更接近,所以'* myarr ++'意味着'*(myarr ++)'。 – dascandy

+0

是* myarr +和*(myarr ++)和myarr ++是相同的。但是,在這種情況下,使用解引用操作符會讓人困惑。每當我們使用解引用運算符時,我們打算指向特定地址的值。如果我們必須簡單地將指針遞增到下一個地址,那麼我們不應該理想地使用解引用操作符。如果你注意到(* myarr)++與* myarr ++或*(myarr ++)不一樣。看看它有多混淆?這就是我的意思 – john