提问人:mindoverflow 提问时间:2/10/2022 最后编辑:Jonathan Lefflermindoverflow 更新时间:2/11/2022 访问量:73
C 传递参考误解
C Pass By Reference Misconception
问:
具体细节很重要。尤其是在谈论某事如何运作时,尤其是当我们考虑某事为什么起作用时。目前,据我了解,C 中的所有内容都是按值传递的。NOTHING 通过引用传递。一些程序员提到 C 语言中的数组是通过引用传递的。 但根据我有限的理解,
即使我们将一个数组传递给这样的函数,它实际上也被当作指针变量的副本,将该数组中第一个元素的位置存储在内存中。然后在函数内部取消引用它,但传递的初始值实际上是一个局部变量。由于分配给程序堆栈中数组的内存是连续的,因此编译器能够使方括号表示法和指针算术一起工作。
void traverse(int arr[4]);
这对我来说和通过引用不是一回事。我认为这是一个重要的区别。
但另一方面,我们可以说计算中的一切都是通过值传递的,因为像 Java 这样的东西会以更微妙的方式做同样的事情。它实际上只是模拟通过引用传递。请指教。
答:
在计算机中的位级别,参数只能按值传递。表示某个参数的位被写入处理器寄存器或指定为传递参数的位置的内存位置。按引用传递是通过使用地址作为传递的值来按值传递的构造。传递地址可以自动或手动实现。这两种方法都是按引用传递的。
当我们通过传递某个实体的地址而不是直接传递其值来传递某个实体时,这称为通过引用传递。这个术语早在C++中创建“引用”之前就已经存在了。在汇编语言中,当我们将某个事物的地址加载到寄存器中并将其传递给函数时,该函数过去和现在都称为“通过引用传递”。C 标准指定指针提供对实体的引用 (C 2018 6.2.5 20)。因此,当我们有一个指向对象的指针时,我们有一个对对象的引用,当我们将指针传递到一个函数时,我们将一个对对象的引用传递给函数。
某些语言会自动传递引用。FORTRAN 通过引用传递所有内容,除了一些用于在 FORTRAN 外部调用例程的特殊语法。但是,无论通过引用传递是作为编程语言的自动功能实现的,是由程序员手动加载汇编语言中的地址,还是由程序员手动请求带有语言运算符(如 C)的地址来实现,当传递对对象的引用时,该对象都是通过引用传递的。&
C++创建了一个称为“引用”的新类型,但这是该词的新用法。“引用”的 C++ 含义仅适用于 C++。它不会在 C++ 上下文之外更改该词的现有用法。在C++之外,“reference”具有其普通的英语含义,即提供有关另一事物的信息。
关于您在 C 中传递数组的具体问题, 在 C 语言中,数组参数会自动转换为其第一个元素的地址,并且该地址通常用于访问整个数组。因此,数组实际上是通过引用传递的。将其描述为自动转换为指针只是记录详细信息。效果是一样的:通过提供对调用方指定的对象的引用,使函数能够访问该对象。
此外,任何关于“通过引用传递”含义的争议都只是关于术语,而不是关于计算机中使用的实际机制。
评论
*
int x=3
x
x
int* p = &x
p
x
*x
*x = 5;