2017-02-21 26 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