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

时间:2020-03-29 23:36:01

标签: c++ arrays pointers dereference

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

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

谢谢。

3 个答案:

答案 0 :(得分:3)

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

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

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

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

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

除了运算符超载的情况外,*&本质上相互抵消。它们是逆运算。 *&arr[0]arr[0]相同,而*&arrarr相同。


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,则它会像其他数组表达式一样衰减为一个。

相关问题