我怎么理解 &*(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);
结论:所有这些都做同样的事情,但略有不同。
这是 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);
结论:所有这些都做同样的事情,但略有不同。