我如何理解 &*(x+i)?

How can i understand &*(x+i)?

本文关键字:x+i 何理解      更新时间:2023-10-16

这是 c++ 代码:

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

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

shell &x[i]==&*(x+i)==x+i;这一行向您展示了获取数组特定元素地址的 3 种不同方法。

在您的情况下,有一个数组x存储 5 个值。第一件事可能看起来有点熟悉。 x[i]将获取x的第i个元素,通过使用运算符的地址,您将获得i -th元素的地址。

让我们继续第三个语句x+i。由于x实际上只是一个指向存储中实际数组的第一个元素的地址的指针,因此您可以通过向x添加偏移量来获取其他元素的地址。但是,由于您使用的是x地址,因此您不会获得"偏移"元素的值,而是其地址。要获取该值,您需要使用神奇的*取消对地址的引用。因此,如果&x[i]获得第 i 个元素的地址并且x+i做同样的事情,*(x+i)将执行与x[i]相同的操作。它将获得x的第i个值。

不,您知道操作者的地址&去引用操作员*什么.第二种说法相当简单。 (x+i)将获取第 i 个元素的地址。 *(x+i)将通过取消引用地址来获取值,&*(x+i)将获得取消围栏地址的地址。所以第二句话和写x+i是一样的。

但是,解释的行可能会给您一个编译器错误,因为它应该更像这样:(&x[i]) == (&*(x+i)) && (&x[i]) == (x+i);

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

假设我们有这段代码

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

那么这个比较是正确的:

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

出于类似的原因,这种比较也是正确的。

&*(x+i) == x+i;