C 中结构的表达式 "passing by reference"
Expression "passing by reference" for structs in C
我最近有一个关于 C 中的结构的 class,讲师使用“按引用传递”这个表达来描述将指向结构的指针传递给函数的操作。
我一直读到 C 没有“按引用传递”,因为与 Cpp 不同,按引用传递只能通过按值传递指向某个对象的指针来模拟——我们更应该说“按指针传递”。所以我想知道结构的工作方式是否不同,这个表达式在这种情况下是否合理。
So I am wondering whether or not things work differently for structures and this expression is justified in this context.
如果您将传递 int *
描述为“通过指针传递”,那么您还应该将传递 struct foo *
描述为“通过指针传递”。与其他类型的对象相比,需要甚至建议选择不同单词的结构没有什么特别之处。
在实践中,这个领域的实际单词用法多种多样,但我是反对使用术语“按引用传递”来描述传递指针的人之一。我认为这有充分的理由,但它们是相切的。
按值传递和按引用传递是我们在语言中将参数传递给子例程或函数时的常用措辞不可知论的方式。
前者表示调用者永远不会看到变量的变化,仅用于输入数据,后者表示调用者将看到变化,用于input/output或仅输出数据。
在C语言中,由于该语言只允许by value,因此by reference方式是通过指针来模拟的,但是它是实现细节和目标确实是 通过引用传递 语义。
对于你的确切问题,结构没有什么特别的,如果你想要通过引用语义,你将必须传递一个指针。
结构的唯一特殊之处在于,您可以 return 函数中的结构,这在 70 年代或 80 年代早期的第一个 K&R C 版本中是不允许的。
根据 C 标准,指针“提供引用”(C 2018 6.2.5 20)。这是“参考”的常见英语含义;如果一篇报纸文章说“马修斯法官下令……”,那就是对马修斯法官的引用。
当通过为被调用函数提供指向对象的指针而不是通过提供对象的值来传递对象时,即为引用调用。
C++ 创建了一个新功能并将其称为“引用”,为该术语赋予了新的含义。该术语在 C++ 的上下文中具有该含义。它在医学、普通英语、考古学、C 或其他语境中没有那个意思。在 C 语言中,当我们说某物通过引用传递时,我们的意思是传递指向它的指针的值。
I have always read that C does not have "pass by reference" because, unlike Cpp, pass by reference can only be emulated by passing by value a pointer towards some object — and we should rather say "pass by pointer".
您将 reference
的两个相似但不同的含义混为一谈。 “按引用传递”这个短语不一定适用于 C++ 的引用类型,在幕后,它本质上是具有更安全、更有限语义的指针。这意味着您不是直接提供值,而是通过说明它的位置来提供它。如果我要你粉刷房子,我可以带你去那房子叫你粉刷,也可以把房子的地址给你;地址是引用另一个对象的对象,即引用。
将指向对象的指针传递给函数,以便可以修改原始对象在 C 和 Pascal 等语言中长期以来被称为 按引用传递,这很可能为什么 C++ 引用类型如此命名。这是适用于大多数语言的一般概念。 指针传递 似乎是在 C++ 将引用引入为不同类型后开始使用的短语。简而言之,在混合的 C/C++ 上下文中,使用 pass by reference 可能会产生歧义,因此使用 pass by pointer 更具体当那是你的意思。但是您应该理解 引用传递 在与语言无关的上下文中表示任何类型的引用,无论它是语言提供的特定类型还是更通用的指针。当具体谈论 C 时,pass by pointer 和 pass by reference 意思相同。
我最近有一个关于 C 中的结构的 class,讲师使用“按引用传递”这个表达来描述将指向结构的指针传递给函数的操作。 我一直读到 C 没有“按引用传递”,因为与 Cpp 不同,按引用传递只能通过按值传递指向某个对象的指针来模拟——我们更应该说“按指针传递”。所以我想知道结构的工作方式是否不同,这个表达式在这种情况下是否合理。
So I am wondering whether or not things work differently for structures and this expression is justified in this context.
如果您将传递 int *
描述为“通过指针传递”,那么您还应该将传递 struct foo *
描述为“通过指针传递”。与其他类型的对象相比,需要甚至建议选择不同单词的结构没有什么特别之处。
在实践中,这个领域的实际单词用法多种多样,但我是反对使用术语“按引用传递”来描述传递指针的人之一。我认为这有充分的理由,但它们是相切的。
按值传递和按引用传递是我们在语言中将参数传递给子例程或函数时的常用措辞不可知论的方式。
前者表示调用者永远不会看到变量的变化,仅用于输入数据,后者表示调用者将看到变化,用于input/output或仅输出数据。
在C语言中,由于该语言只允许by value,因此by reference方式是通过指针来模拟的,但是它是实现细节和目标确实是 通过引用传递 语义。
对于你的确切问题,结构没有什么特别的,如果你想要通过引用语义,你将必须传递一个指针。
结构的唯一特殊之处在于,您可以 return 函数中的结构,这在 70 年代或 80 年代早期的第一个 K&R C 版本中是不允许的。
根据 C 标准,指针“提供引用”(C 2018 6.2.5 20)。这是“参考”的常见英语含义;如果一篇报纸文章说“马修斯法官下令……”,那就是对马修斯法官的引用。
当通过为被调用函数提供指向对象的指针而不是通过提供对象的值来传递对象时,即为引用调用。
C++ 创建了一个新功能并将其称为“引用”,为该术语赋予了新的含义。该术语在 C++ 的上下文中具有该含义。它在医学、普通英语、考古学、C 或其他语境中没有那个意思。在 C 语言中,当我们说某物通过引用传递时,我们的意思是传递指向它的指针的值。
I have always read that C does not have "pass by reference" because, unlike Cpp, pass by reference can only be emulated by passing by value a pointer towards some object — and we should rather say "pass by pointer".
您将 reference
的两个相似但不同的含义混为一谈。 “按引用传递”这个短语不一定适用于 C++ 的引用类型,在幕后,它本质上是具有更安全、更有限语义的指针。这意味着您不是直接提供值,而是通过说明它的位置来提供它。如果我要你粉刷房子,我可以带你去那房子叫你粉刷,也可以把房子的地址给你;地址是引用另一个对象的对象,即引用。
将指向对象的指针传递给函数,以便可以修改原始对象在 C 和 Pascal 等语言中长期以来被称为 按引用传递,这很可能为什么 C++ 引用类型如此命名。这是适用于大多数语言的一般概念。 指针传递 似乎是在 C++ 将引用引入为不同类型后开始使用的短语。简而言之,在混合的 C/C++ 上下文中,使用 pass by reference 可能会产生歧义,因此使用 pass by pointer 更具体当那是你的意思。但是您应该理解 引用传递 在与语言无关的上下文中表示任何类型的引用,无论它是语言提供的特定类型还是更通用的指针。当具体谈论 C 时,pass by pointer 和 pass by reference 意思相同。