这是C++代码:我如何理解&*(x + i)?
x[5]={1,2,3,4,5};
&x[i]==&*(x+i)==x+i;
为&*(x+i)
,在我看来,*(x+i)
是一个右值,为什么要用&
。 为什么?
这是C++代码:我如何理解&*(x + i)?
x[5]={1,2,3,4,5};
&x[i]==&*(x+i)==x+i;
为&*(x+i)
,在我看来,*(x+i)
是一个右值,为什么要用&
。 为什么?
此行&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]
相同的操作。它会得到x
的i
th值。
不,你知道什么ADRESS-的-算子&
和derefencing运营商*
。因此,第二个陈述非常简单。 (x+i)
将得到i
th元素的地址。 *(x+i)
将通过取消引用地址获得值,&*(x+i)
将获得derefenced地址的地址。所以第二种说法与编写x+i
是一样的。
然而,解释线将可能给你一个编译器错误,因为它更应该是这样的:(&x[i]) == (&*(x+i)) && (&x[i]) == (x+i);
结论:所有这些事情做同样的事情又略有不同。
我只是认为*(x + i)是一个右值,不能在它之前使用&。我错了,*(x + i)是一个左值,你是对的,非常感谢 – DayByDay
让我们假设有这段代码
int i = 0;
int x[5]={1,2,3,4,5};
那么这个对比是正确的:
&x[i] == &*(x+i)
,这比较也是出于同样的原因属实。
&*(x+i) == x+i;
_“为什么要使用'&.'为什么?”_请问作者,我们怎样才能读懂他们的想法?该代码看起来很荒谬。 –
为什么你认为'*(x + i)'是一个右值?您可以指定给它,例如'*(x + i)= 10'。 – chi