如果 arr 是数组,C++ 中的 *&arr 和 *&arr[0] 有什么区别?

What is the difference between *&arr and *&arr[0] in C++, if arr is an array?

提问人:Alex 提问时间:3/30/2020 最后编辑:Nicol BolasAlex 更新时间:3/30/2020 访问量:1869

问:

假设我有一个名为 的整数数组。我试图理解 和 之间的区别。arr*&arr*&arr[0]

我在 C++ 中读到,本质上是指向数组中第一个元素的指针,并且是指向整个数组的指针。他们都返回相同的地址,我明白这部分。然后,如果我输入 ,则返回第一个元素,即值 at。但是如果我输入 ,则返回 的地址。我的问题是,为什么当我使用 时,返回的是地址,而不是第一个元素?从逻辑上讲,由于运算符返回值,因此人们希望返回第一个元素而不是地址。arr&arr*&arr[0]arr[0]*&arrarr[0]*&arr**&arr

谢谢。

C++ 数组指 针取消 引用

评论

3赞 HolyBlackCat 3/30/2020
为什么希望返回第一个元素? 并相互抵消,所以等价于 ,并且等价于 。*&arr*&*&arr[0]arr[0]*&arrarr
0赞 JaMiT 3/30/2020
也许你应该用一个最小的可重复的例子来证明你在说什么(所以我们对“如果我进入”有一个确切的含义,因为我们不知道你在哪里输入东西)?定义 ,然后输出 和 。当你在做的时候,也输出并解释为什么你期望匹配但不希望匹配。arr*&arr[0]*&arrarr[0]arr*&arr[0]arr[0]*&arrarr
0赞 M.M 3/30/2020
运算符给出一个左值表达式,该表达式指定内存位置。它不会检索该位置的存储值(该操作称为 lvalue-to-rvalue onversion)*

答:

2赞 Caleth 3/30/2020 #1

一个是表达式,另一个是表达式,对于一定大小。intint [N]N

我在 C++ 中读到它本质上是一个指针arr

把那本书扔掉。这是危险的不精确。 可以在一瞬间转换为指针,但它绝对不是指针。arr

它们都返回相同的地址

但不是同一类型。

我的问题是,为什么当我使用 时,返回的是地址,而不是第一个元素?*&arr

因为您取消了对数组指针的引用。如果在需要指针的上下文中使用,则该指针会衰减为 1,就像任何其他数组表达式一样。*&arr

3赞 eerorika 3/30/2020 #2

我在 C++ 中读到它本质上是指向数组中第一个元素的指针arr

这是错误的。如果是一个数组,那么它就是一个数组。数组不是指针 1arr

为什么当我使用*&arr时,返回的地址是

假设它是指向第一个元素的指针,则通过指针 () 进行间接引用会为您提供对第一个元素的左值引用。&arr[0]*&arr[0]

假设它是指向数组的指针,则通过指针 () 间接为您提供对数组的左值引用。就像 一样,当转换为右值时,这个数组左值会衰减为指向第一个元素的指针。&arr*&arrarr

除了运算符过载的情况外,基本上相互抵消。它们是逆运算。 给你和你一样,给你和你一样。*&*&arr[0]arr[0]*&arrarr


1 除了在函数参数的声明中,数组参数实际上根本不声明数组,而是指向该数组元素的指针。

评论

0赞 Eljay 3/30/2020
• NIT:函数及其参数的声明。参数是 callsite 传递给函数的内容。
0赞 eerorika 3/30/2020
@Eljay我永远无法知道哪个是哪个:)特别令人困惑,因为它们有时也被称为“正式”参数/参数和“实际”参数/参数,在上下文中它们是同义词。
0赞 Eljay 3/30/2020
我终于用了助记词“参数就像汽车,参数就像停车位”。
3赞 Miles Budnek 3/30/2020 #3

我在 C++ 中读到它本质上是指向数组中第一个元素的指针arr

那么无论你读到什么都是错的。诚然,如果你看错了数组,它们会衰减为指向它们的第一个元素的指针,但数组不是指针


顺便说一句:

  • *&arr生成整个数组。 形成指向数组的指针,并取消引用该指针。因此,该表达式的类型与 相同。再一次,如果你看错了,这将衰减为指向数组第一个元素的指针。例如,如果您尝试使用 打印它,数组将衰减为指向其第一个元素的指针,并可能最终调用重载。&arr*arrstd::cout << *&arroperator<<(std::ostream&, void*)

  • *&arr[0]生成数组的第一个元素。 索引到数组中,形成指向数组第一个元素的指针,然后取消引用该指针。该表达式的类型与 相同。arr[0]&*arr[0]