![](/img/trans.png)
[英]C++: What is the difference between ' arr ' and ' arr[] '
[英]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.