C 通过引用传递的误解

C Pass By Reference Misconception

具体情况很重要。尤其是在谈论某事如何运作时,尤其是当我们考虑某事为何运作时。目前,据我了解,C 中的 EVERYTHING 通过值 传递的。 NOTHING 通过引用传递。一些程序员提到 C 中的数组 通过引用传递 。 但据我有限的了解,

Even if we pass an array to a function like this void traverse(int arr[4]);, it is actually being taken in as a copy of the pointer variable storing the location in memory of the first element in that array. It is then dereferenced inside the function, but the initial value being passed is actually a local variable. Since memory allocated to arrays in the program stack would be contiguous, the compiler is able to make square bracket notation work as well as pointer arithmetic.

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

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

在计算机的位级别上,参数只能按值传递。代表某些参数的位被写入指定为传递参数的位置的处理器寄存器或内存位置。按引用传递是一种构建在按值传递的基础上的构造,它使用地址作为传递的值。传递地址可以自动或手动实现。两种方法都是pass-by-reference.

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

一些语言自动化 pass-by-reference。 FORTRAN 通过引用传递所有内容,除了一些用于在 FORTRAN 之外调用例程的特殊语法。但是,passing-by-reference是作为编程语言的自动特性实现的,是程序员用汇编语言手动加载地址,还是程序员用C语言的&等语言运算符手动请求地址,当传递一个对象的引用时,则该对象通过引用传递。

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

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

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