【问题标题】:Does C even have "pass by reference"? [duplicate]C甚至有“通过引用”吗? [复制]
【发布时间】:2013-06-14 15:39:45
【问题描述】:

我听说在“c”中我们可以通过“按值调用”或“按引用调用”来传递参数。 但在一本书中提到,我们可以通过两种方式传递参数,但没有“通过引用”,但我实际上通过“通过引用”传递大部分参数。

那么为什么提到“C 甚至有“通过引用”?

详细的描述将不胜感激。

【问题讨论】:

  • C 中没有传递引用。
  • 你在哪里hear它?以及如何在 C 语言中管理pass-by-reference? (你错了)
  • @SuvP 在“c”中没有通过引用传递的东西,但通过引用传递意味着我们正在传递地址以通过指针访问数据,但我的问题是,当我们将地址传递给访问数据为什么提到它没有“通过引用传递”。当我们通过值调用或引用调用访问相同的数据时。

标签: c pointers


【解决方案1】:

C 参数总是按值而不是按引用传递。但是,如果您将对象的地址视为对该对象的引用,那么您可以按值传递该引用。例如:

void foo(int *x)
{
    *x = 666;
}

你在评论中提问:

既然我们可以按值传递所有参数,为什么还要在 C 中使用指针呢?

因为在只支持按值传递的语言中,缺少指针会受到限制。这意味着您不能编写这样的函数:

void swap(int *a, int *b)
{
    int temp = *a;
    *b = *a;
    *a = temp;
}

例如,在 Java 中,不可能编写该函数,因为它只有按值传递,没有指针。

在 C++ 中,您可以使用如下引用来编写函数:

void swap(int &a, int &b)
{
    int temp = a;
    b = a;
    a = temp;
}

在 C# 中也是如此:

void swap(ref int a, ref int b)
{
    int temp = a;
    b = a;
    a = temp;
}

【讨论】:

  • @David Heffernan 在“c”中没有通过引用传递,但通过引用传递意味着我们正在传递地址以通过指针访问数据,但我的问题是,当我们传递地址时访问数据为什么提到它没有“通过引用”。当我们通过值调用或引用调用访问相同的数据时。
  • @David Heffernan 我知道,所以当我们可以按值传递所有参数时,为什么我们需要“c”中的指针????
  • 如果你没有指针,那么你就不能“假”通过引用。或者正如 Kerrek 所说(比我更清楚),如果没有指针,您将无法自己组装引用语义。
  • @BertieWheen 不,他们不是。这些类型已经是参考。这是一个很常见的误解。当您将对象作为参数传递时,您将按值传递引用。您也不能在 Java 中为对象编写交换函数。阅读:stackoverflow.com/questions/40480/is-java-pass-by-reference
  • @BertieWheen 我的想法是Java实现使用指针,但Java语言没有指针。 Anway,你不能在 Java 中实现swap 可以吗?
【解决方案2】:

“引用语义”的概念是一个抽象的理论概念,这意味着您可以通过为函数提供对数据的引用来修改现有数据。

问题是引用语义是否可以由一种语言实现。在 C 中,您可以通过使用指针来获得引用语义。这意味着您可以获得所需的行为,但您需要自己从各种零碎(指针类型、地址运算符、取消引用运算符、将指针作为函数参数(“按值”)传递)组装起来。

相比之下,C++ 包含本机引用类型,因此直接在语言中实现引用语义。

其他语言对此有不同的处理方法,例如,在 Python 中,许多东西默认是引用(当b 是一个列表时,a = ba = b[:] 之间存在差异)。一种语言是否以及如何提供引用与价值语义是语言设计的重要组成部分。

【讨论】:

    猜你喜欢
    • 2020-07-02
    • 1970-01-01
    • 2019-09-08
    • 1970-01-01
    • 2015-03-29
    • 1970-01-01
    • 1970-01-01
    • 2018-02-11
    • 2017-05-25
    相关资源
    最近更新 更多