【问题标题】:What is the difference between *&arr and *&arr[0] in C++, if arr is an array?如果 arr 是一个数组,C++ 中的 *&arr 和 *&arr[0] 有什么区别?
【发布时间】:2020-07-10 07:44:47
【问题描述】:

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

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

谢谢。

【问题讨论】:

  • 为什么你期望*&arr 返回第一个元素? *&相互抵消,所以*&arr[0]等价于arr[0]*&arr等价于arr
  • 也许你应该用minimal reproducible example 证明你在说什么(所以我们对“如果我输入”有一个精确的含义,因为我们不知道你在哪里输入东西)?定义arr,然后输出*&arr[0]*&arr。当你这样做时,还要输出arr[0]arr 并解释为什么你期望*&arr[0] 匹配arr[0] 但不要期望*&arr 匹配arr
  • * 运算符给出了一个左值表达式,它指定了一个内存位置。它不会检索该位置的存储值(该操作称为 lvalue-to-rvalue onversion)

标签: c++ arrays pointers dereference


【解决方案1】:

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

那么你读到的都是错的。确实,如果您看错数组,它们会衰减为指向其第一个元素的指针,但数组不是指针


不碍事的:

  • *&arr 产生整个数组。 &arr 形成一个指向数组的指针,* 取消引用该指针。因此,该表达式的类型与arr 相同。再一次,如果你看错了,这将衰减为指向数组第一个元素的指针。例如,如果您尝试使用 std::cout << *&arr 打印它,则数组将衰减为指向其第一个元素的指针,并可能最终调用 operator<<(std::ostream&, void*) 重载。

  • *&arr[0] 产生数组的第一个元素。 arr[0] 索引数组,& 形成指向数组第一个元素的指针,然后 * 取消引用该指针。该表达式的类型与arr[0] 相同。

【讨论】:

    【解决方案2】:

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

    这是错误的。如果arr 是一个数组,那么它就是一个数组。数组不是指针 1.

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

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

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

    除了运算符重载的情况外,*& 本质上是相互抵消的。它们是逆运算。 *&arr[0] 提供与arr[0] 相同的功能,*&arr 提供与arr 相同的功能。


    1 除了在函数参数的声明中,数组参数实际上根本没有声明一个数组,而是一个指向该数组元素的指针。

    【讨论】:

    • • nit:函数及其参数的声明。参数是调用站点传递给函数的内容。
    • @Eljay 我永远无法知道哪个是哪个:) 特别令人困惑,因为它们有时也被称为“正式”参数/参数和“实际”参数/参数,在上下文中它们是同义词.
    • 我终于用了助记词“参数像汽车,参数像停车位”。
    【解决方案3】:

    一个是int 表达式,另一个是int [N] 表达式,对于某些大小N

    我在 C++ 中读到过,arr 本质上是一个指针

    把那本书扔掉。这是危险的不精确。 arr 可以随时转换为指针,但绝对不是指针。

    它们都返回相同的地址

    但不是同一类型。

    我的问题是,为什么当我使用*&arr时,返回的是地址,而不是第一个元素?

    因为您取消了指向数组的指针。如果您在需要指针的上下文中使用 *&arr,它会衰减为 1,就像任何其他数组表达式一样。

    【讨论】:

      猜你喜欢
      • 2011-04-27
      • 1970-01-01
      • 2021-09-16
      • 2011-07-26
      • 2012-04-28
      • 2012-02-13
      • 2012-12-05
      • 1970-01-01
      • 2010-11-18
      相关资源
      最近更新 更多