我怎么理解 &*(x+i)?

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

这是 C++ 代码:

x[5]={1,2,3,4,5};
&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;

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

在您的例子中,有一个数组 x 存储了 5 个值。您可能看起来很熟悉的第一件事。 x[i] 将获得 x 的第 i 个元素,通过使用 address-of-operator 您将获得 i-第一个元素.

我们继续第三个陈述x+i。由于 x 实际上只是一个指针,指向存储中实际数组的第一个元素的地址,您可以通过向 x 添加偏移量来获取其他元素的地址。但是,由于您使用的是 x' 地址,因此您不会获得 'offsetted' 元素的值,而是它的地址。要获得您需要使用神奇的 * 取消引用地址的值。因此,如果 &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);

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