【问题标题】:Expression "passing by reference" for structs in CC 中结构的表达式“通过引用传递”
【发布时间】:2021-06-06 09:56:40
【问题描述】:

我最近有一个关于 C 结构的课程,讲师使用“通过引用传递”这个表达方式来描述将指向结构的指针传递给函数的操作。 我一直读到 C 没有“按引用传递”,因为与 Cpp 不同,按引用传递只能通过按值传递指向某个对象的指针来模拟——我们宁愿说“按指针传递”。所以我想知道结构的工作方式是否有所不同,并且这个表达式在这种情况下是合理的。

【问题讨论】:

  • 指向对象的指针是“按值传递”的,所以你得到一个对对象的“引用”,传统上称为“按引用传递”。
  • 他们可能口语化地使用了这个词。当然,按引用传递技术上 不是 C 中的概念,但是按指针传递在某种程度上基本上是对传递引用的模拟。您传递指针参数获取的变量的地址,因此它本质上是一个“引用”。
  • 通过引用传递并不是 C++ 的特定术语。它只是意味着当你传递一个参数时,你实际上传递的是参数本身而不是副本。我确信除了 C++ 之外还有其他语言也可以通过引用传递(很确定 Pascal 也允许通过值和引用传递),甚至可能还有一些允许通过引用传递only
  • 这能回答你的问题吗? Passing by reference in C

标签: c struct pass-by-reference terminology pass-by-pointer


【解决方案1】:

我一直读到 C 没有“按引用传递”,因为与 Cpp 不同,按引用传递只能通过按值传递指向某个对象的指针来模拟——我们应该说“按指针传递”。

您将reference 的两个相似但不同的含义混为一谈。短语“按引用传递”不一定与 C++ 的引用类型有关,它在本质上是具有更安全、更有限语义的指针。这意味着您不是直接提供值,而是通过说出它的位置来提供它。如果我要你粉刷房子,我可以带你去房子让你刷,或者我可以给你房子的地址;地址是一个引用另一个对象的对象,即引用。

将指向对象的指针传递给函数以便修改原始对象在 C 和 Pascal 等语言中早已被称为通过引用传递,这很可能是为什么 C++ 引用类型就是这样命名的。这是适用于大多数语言的一般概念。 按指针传递 似乎是在 C++ 将引用作为不同类型引入之后开始使用的短语。简而言之,在混合 C/C++ 上下文中使用 按引用传递 可能会产生歧义,因此当您的意思是这样时,使用 按指针传递 会更具体。但是您应该在与语言无关的上下文中理解 按引用传递 来表示任何类型的引用,无论它是语言提供的特定类型还是更通用的指针。而具体说到C,指针传递引用传递意思是一样的。

【讨论】:

    【解决方案2】:

    根据 C 标准,指针“提供引用”(C 2018 6.2.5 20)。这是“参考”的常见英文意思;如果一篇报纸文章说“马修斯法官下令……”,那就是对马修斯法官的引用。

    当一个对象通过给被调用函数一个指向该对象的指针而不是给该对象的值来传递时,这就是一个引用调用。

    C++ 创造了一个新特性并将其称为“参考”,赋予该术语新的含义。该术语在 C++ 的上下文中具有该含义。它在医学、普通英语、考古学、C 或其他上下文中没有那个含义。在 C 中,当我们说通过引用传递某事物时,我们的意思是传递指向它的指针的值。

    【讨论】:

      【解决方案3】:

      按值传递按引用传递是当我们谈到以与语言无关的方式将参数传递给子例程或函数时的常用措辞。

      前者表示调用者永远不会看到变量的变化并且仅用于输入数据,后者表示调用者将看到变化并用于输入/输出或仅输出数据。

      在C语言中,由于语言只允许按值按引用的方式是用指针来模拟的,但它是一个实现细节,目标确实是具有通过引用传递语义。

      对于您的确切问题,结构没有什么特别之处,如果您想要 by reference 语义,则必须传递一个指针。

      结构的唯一特殊之处在于,您可以从函数中返回结构,这在 70 年代或 80 年代初期的第一个 K&R C 版本中是不允许的。

      【讨论】:

        【解决方案4】:

        所以我想知道结构的工作方式是否有所不同,并且这个表达式在这种情况下是合理的。

        如果您将传递int * 描述为“按指针传递”,那么您还应该将传递struct foo * 描述为“按指针传递”。与其他类型的对象相比,结构需要甚至建议选择不同的词,并没有什么特别之处。

        在实践中,该领域的实际单词用法多种多样,但我是反对使用术语“通过引用传递”来描述传递指针的人之一。我认为这是有充分理由的,但它们会是切线的。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2013-05-12
          • 2011-02-02
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-09-11
          相关资源
          最近更新 更多