-1

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

4

4 回答 4

2

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

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

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

于 2021-03-08T14:07:59.543 回答
2

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

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

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

对于您的精确问题,在结构方面没有什么特别的,并且您想要通过引用语义,您将必须传递一个指针。

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

于 2021-03-08T14:10:00.523 回答
1

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

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

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

于 2021-03-08T14:18:48.587 回答
0

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

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

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

于 2021-03-08T16:04:46.760 回答