2016-03-08 36 views
-5

这是C++代码:我如何理解&*(x + i)?

x[5]={1,2,3,4,5}; 
&x[i]==&*(x+i)==x+i; 

&*(x+i),在我看来,*(x+i)是一个右值,为什么要用&。 为什么?

+3

_“为什么要使用'&.'为什么?”_请问作者,我们怎样才能读懂他们的想法?该代码看起来很荒谬。 –

+0

为什么你认为'*(x + i)'是一个右值?您可以指定给它,例如'*(x + i)= 10'。 – chi

回答

2

此行&x[i]==&*(x+i)==x+i;壳你表演上得到一个数组的特定元素的地址,3分不同的方式。

在你的情况下,有一个数组x,它存储5个值。 probaly的第一件事看起来很熟悉你。 x[i]将获得x的第i个元素,并且通过使用地址运营商,您将获得i的第012个元素的地址。

让我们继续第三条语句x+i。由于x实际上只是一个指向存储器中实际阵列的第一个元素的地址的指针,因此您可以通过将偏移量添加到x来获得其他元素的地址。但是,由于您使用的是x的地址,因此您不会获得'抵消'元素的值,但它的地址。通过使用神奇的*来获得你需要的价值来减少地址。因此,如果&x[i]获得i th元素的地址并且x+i也是如此,则*(x+i)将执行与x[i]相同的操作。它会得到xi th值。

不,你知道什么ADRESS-的-算子&derefencing运营商*。因此,第二个陈述非常简单。 (x+i)将得到i th元素的地址。 *(x+i)将通过取消引用地址获得值,&*(x+i)将获得derefenced地址的地址。所以第二种说法与编写x+i是一样的。

然而,解释线将可能给你一个编译器错误,因为它更应该是这样的:(&x[i]) == (&*(x+i)) && (&x[i]) == (x+i);

结论:所有这些事情做同样的事情又略有不同。

+0

我只是认为*(x + i)是一个右值,不能在它之前使用&。我错了,*(x + i)是一个左值,你是对的,非常感谢 – DayByDay

0

让我们假设有这段代码

int i = 0; 
int x[5]={1,2,3,4,5}; 

那么这个对比是正确的:

&x[i] == &*(x+i) 

,这比较也是出于同样的原因属实。

&*(x+i) == x+i; 
相关问题