C 传递参考误解

C Pass By Reference Misconception

提问人:mindoverflow 提问时间:2/10/2022 最后编辑:Jonathan Lefflermindoverflow 更新时间:2/11/2022 访问量:73

问:

具体细节很重要。尤其是在谈论某事如何运作时,尤其是当我们考虑某事为什么起作用时。目前,据我了解,C 中的所有内容都是按值传递的。NOTHING 通过引用传递。一些程序员提到 C 语言中的数组是通过引用传递的。 但根据我有限的理解,

即使我们将一个数组传递给这样的函数,它实际上也被当作指针变量的副本,将该数组中第一个元素的位置存储在内存中。然后在函数内部取消引用它,但传递的初始值实际上是一个局部变量。由于分配给程序堆栈中数组的内存是连续的,因此编译器能够使方括号表示法和指针算术一起工作。void traverse(int arr[4]);

这对我来说和通过引用不是一回事。我认为这是一个重要的区别。

但另一方面,我们可以说计算中的一切都是通过值传递的,因为像 Java 这样的东西会以更微妙的方式做同样的事情。它实际上只是模拟通过引用传递。请指教。

数组 C 指针 按引用传递

评论

1赞 Iłya Bursov 2/10/2022
不,指针是值的实际位置,它是值的地址,取消引用指针意味着获得实际值
2赞 paddy 2/10/2022
引用是一个概念。您可以通过使用指针在 C 中实现类似引用的行为。我们经常使用术语“引用”和“取消引用”来描述添加或删除一个间接级别,但不要将其与实际的语言功能混淆。在 C++ 中,实际引用作为语言的一个特性存在。然而,在描述指针间接时,我们仍然经常使用术语“引用”和“取消引用”。这与“有参考”不是一回事。
1赞 Jerry Jeremiah 2/10/2022
这是真的。Java “按引用”传递对象,“按值”传递内部函数——它们在源代码中的传递方式看起来是相同的。您无法通过查看函数调用的源代码来判断变量是否会更新。Java 在下面做了一些魔术,让它以这种方式工作。但是在 C 语言中,你知道你传递的内容永远无法被修改——一切都是按值传递的。因此,指针变量存储变量的地址,取消引用运算符 () 返回该地址处的项目,但可以修改该项目,因此您不需要在 C 中“按引用”传递。*
1赞 Jerry Jeremiah 2/10/2022
在 C 中,如果 ,3 将存储在内存中(例如,地址 12345)。传递给函数。如果传递值 3 将从地址 12345 复制到堆栈(例如复制到 678),则函数参数变量存储在地址 678。如果函数更改参数,它将更新地址 678。该函数无法更新地址 12345。因此,你和现在包含 12345。将其传递给函数,函数参数变量包含 12345。取消引用地址 12345 () 生成 3,但您也可以分配:int x=3xxint* p = &xpx*x*x = 5;
1赞 Jerry Jeremiah 2/10/2022
也许你的问题更多是“Java 如何模拟引用传递?它是否像手动使用 C 一样偷偷摸摸地在引擎盖下使用指针?

答:

3赞 Eric Postpischil 2/10/2022 #1

在计算机中的位级别,参数只能按值传递。表示某个参数的位被写入处理器寄存器或指定为传递参数的位置的内存位置。按引用传递是通过使用地址作为传递的值来按值传递的构造。传递地址可以自动或手动实现。这两种方法都是按引用传递的。

当我们通过传递某个实体的地址而不是直接传递其值来传递某个实体时,这称为通过引用传递。这个术语早在C++中创建“引用”之前就已经存在了。在汇编语言中,当我们将某个事物的地址加载到寄存器中并将其传递给函数时,该函数过去和现在都称为“通过引用传递”。C 标准指定指针提供对实体的引用 (C 2018 6.2.5 20)。因此,当我们有一个指向对象的指针时,我们有一个对对象的引用,当我们将指针传递到一个函数时,我们将一个对对象的引用传递给函数。

某些语言会自动传递引用。FORTRAN 通过引用传递所有内容,除了一些用于在 FORTRAN 外部调用例程的特殊语法。但是,无论通过引用传递是作为编程语言的自动功能实现的,是由程序员手动加载汇编语言中的地址,还是由程序员手动请求带有语言运算符(如 C)的地址来实现,当传递对对象的引用时,该对象都是通过引用传递的。&

C++创建了一个称为“引用”的新类型,但这是该词的新用法。“引用”的 C++ 含义仅适用于 C++。它不会在 C++ 上下文之外更改该词的现有用法。在C++之外,“reference”具有其普通的英语含义,即提供有关另一事物的信息。

关于您在 C 中传递数组的具体问题, 在 C 语言中,数组参数会自动转换为其第一个元素的地址,并且该地址通常用于访问整个数组。因此,数组实际上是通过引用传递的。将其描述为自动转换为指针只是记录详细信息。效果是一样的:通过提供对调用方指定的对象的引用,使函数能够访问该对象。

此外,任何关于“通过引用传递”含义的争议都只是关于术语,而不是关于计算机中使用的实际机制。

评论

0赞 mindoverflow 2/11/2022
谢谢你把事情弄清楚,没有批评我缺乏知识。这对我非常有帮助。在没有任何参考的情况下发布绝对陈述的人实际上破坏了我以前的一些正确概念。