假设我有一个名为arr
的整数数组。我试图理解*&arr
和*&arr[0]
之间的区别。
我读到在C ++中,arr
本质上是指向数组中第一个元素的指针,而&arr
是指向整个数组的指针。他们俩都返回相同的地址,我明白了。然后,如果我输入*&arr[0]
,则返回第一个元素,即arr[0]
的值。但是,如果我输入*&arr
,则会返回arr[0]
的地址。我的问题是,为什么当我使用*&arr
时,返回的是地址而不是第一个元素?根据逻辑,由于运算符*
返回值,因此人们希望*&arr
返回第一个元素而不是地址。
谢谢。
答案 0 :(得分:3)
我读到在C ++中,
arr
本质上是指向数组中第一个元素的指针
这是错误的。如果arr
是一个数组,则它是一个数组。数组不是指针 1 。
为什么当我使用*&arr时,返回的地址是
鉴于&arr[0]
是指向第一个元素的指针,通过指针(*&arr[0]
)的间接引用为您提供了对第一个元素的左值引用。
鉴于&arr
是指向数组的指针,通过指针(*&arr
)间接为您提供对该数组的左值引用。就像arr
一样,此数组左值在转换为右值时会衰减为指向第一个元素的指针。
除了运算符超载的情况外,*&
本质上相互抵消。它们是逆运算。 *&arr[0]
与arr[0]
相同,而*&arr
与arr
相同。
1 除了函数参数的声明外,数组参数实际上根本不声明数组,而是指向该数组元素的指针。
答案 1 :(得分:3)
我读到在C ++中,
arr
本质上是指向数组中第一个元素的指针
然后,您所读的内容都是错误的。的确,如果您看错数组,数组将衰减为指向其第一个元素的指针,但是数组不是指针。
那没关系:
*&arr
产生整个数组。 &arr
形成了指向数组的指针,*
取消了对该指针的引用。因此,该表达式的类型与arr
相同。再次,如果您看错了,它将衰减为指向数组第一个元素的指针。例如,如果尝试使用std::cout << *&arr
打印该数组,该数组将衰减为指向其第一个元素的指针,并可能最终调用operator<<(std::ostream&, void*)
重载。
*&arr[0]
产生数组的第一个元素。 arr[0]
索引数组,&
形成指向数组第一个元素的指针,然后*
取消引用该指针。该表达式的类型与arr[0]
相同。
答案 2 :(得分:2)
一个是int
表达式,另一个是int [N]
表达式,大小为N
。
我了解到在C ++中,
arr
本质上是一个指针
把那本书扔掉。这是不精确的危险。 arr
可以立即转换为指针,但绝对不是指针。
他们都返回相同的地址
但类型不一样
我的问题是,为什么当我使用
*&arr
时,返回的是地址而不是第一个元素?
因为您已取消引用数组的指针。如果在需要指针的上下文中使用*&arr
,则它会像其他数组表达式一样衰减为一个。