提问人:Alex 提问时间:3/30/2020 最后编辑:Nicol BolasAlex 更新时间:3/30/2020 访问量:1869
如果 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++ 中读到,本质上是指向数组中第一个元素的指针,并且是指向整个数组的指针。他们都返回相同的地址,我明白这部分。然后,如果我输入 ,则返回第一个元素,即值 at。但是如果我输入 ,则返回 的地址。我的问题是,为什么当我使用 时,返回的是地址,而不是第一个元素?从逻辑上讲,由于运算符返回值,因此人们希望返回第一个元素而不是地址。arr
&arr
*&arr[0]
arr[0]
*&arr
arr[0]
*&arr
*
*&arr
谢谢。
答:
一个是表达式,另一个是表达式,对于一定大小。int
int [N]
N
我在 C++ 中读到它本质上是一个指针
arr
把那本书扔掉。这是危险的不精确。 可以在一瞬间转换为指针,但它绝对不是指针。arr
它们都返回相同的地址
但不是同一类型。
我的问题是,为什么当我使用 时,返回的是地址,而不是第一个元素?
*&arr
因为您取消了对数组指针的引用。如果在需要指针的上下文中使用,则该指针会衰减为 1,就像任何其他数组表达式一样。*&arr
我在 C++ 中读到它本质上是指向数组中第一个元素的指针
arr
这是错误的。如果是一个数组,那么它就是一个数组。数组不是指针 1。arr
为什么当我使用*&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]
评论
*&arr
*
&
*&arr[0]
arr[0]
*&arr
arr
arr
*&arr[0]
*&arr
arr[0]
arr
*&arr[0]
arr[0]
*&arr
arr
*