繁体   English   中英

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

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

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

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

谢谢。

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

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

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

鉴于&arr[0]是指向第一个元素的指针,通过指针 ( *&arr[0] ) 间接为您提供对第一个元素的左值引用。

鉴于&arr是一个指向数组的指针,通过指针 ( *&arr ) 进行间接引用为您提供了对该数组的左值引用。 就像arr一样,这个数组左值在转换为右值时衰减为指向第一个元素的指针。

除了运算符重载的情况外, *&基本上相互抵消。 它们是逆运算。 *&arr[0]给你一样arr[0]*&arr为您提供了相同的arr


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

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

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


顺便说一句:

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

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

一个是int表达式,另一个是int [N]表达式,对于某些大小N

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

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

他们都返回相同的地址

但不是同一类型。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM