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



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

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

谢谢。

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

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


这是一个例外:

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

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

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

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

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

假定&arr[0]是指向第一个元素的指针,则通过指针(*&arr[0](进行间接操作将为第一个元素提供左值引用。

假定&arr是指向数组的指针,则通过指针(*&arr(进行间接操作将为数组提供一个左值引用。就像arr一样,这个数组的左值在转换为右值时会衰减为指向第一个元素的指针。

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


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

一个是int表达式,另一个是某种大小的Nint [N]表达式。

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

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

它们都返回相同的地址

但不是同一类型。

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

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

最新更新