假设我有一个名为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]
一样,*&arr
和arr
一样。
1除了函数参数的声明,其中数组参数实际上根本不声明数组,而是指向该数组元素的指针。
一个是int
表达式,另一个是某种大小的N
的int [N]
表达式。
我读到在C++中,
arr
本质上是一个指针
把那本书扔掉。它是危险的不精确。arr
可以在一瞬间转换为指针,但它绝对不是指针。
它们都返回相同的地址
但不是同一类型。
我的问题是,为什么当我使用
*&arr
时,返回的是地址,而不是第一个元素?
因为您已取消引用指向数组的指针。如果在需要指针的上下文中使用*&arr
,它会像其他任何数组表达式一样衰减为一。