首页 > 解决方案 > 我如何描述这两种价值传递方式之间的区别?

问题描述

这就是我理解的在 C 中通过引用传递的内容(注意:我不是 C 程序员):

void foo(int* x) { // The value of the memory address passed into `foo` is copied into parameter `x`
  *x = 1; // The memory address x is dereferenced(?) and the value at that location overwritten
}

int main() {
  int a = 0;
  foo(&a); // The value of the (starting?) memory address associated with `a` is found and supplied as an argument to the function call
  // `a` is now `1`
}

这样,无论是什么类型x(即使是对象(C 中的结构?)),对xinside所做的更改foo都会反映在 main 的范围内,即使整个对象被替换

在 JavaScript 中,原语只是简单地复制,这很容易推理。

但是对于对象 IIUC,它们的内存地址(或等价物)的值被提供给 function foo,这在表面上听起来类似于上面的 C 代码。但是,如果我们给由 parameter 创建的标识符赋值x,这不会反映在 的范围内main

function foo(x) {
  x = { bam: 'this is bam' }; // The value of the memory address passed into `foo` is copied into parameter `x`
}

function main() {
  let a = { bar: 'this is bar' };
  foo(a); // The value of the memory address associated with `a` is found and supplied as an argument to the function call (?)
  // `a` is unchaged
}

JavaScript 是按值传递的。对于对象,它有时被称为 pass-by-value-of-the-reference - 很公平 - 但在上面的 C 代码中,引用的值(OK 指针)也被复制到函数中。那么如何描述按引用传递和按值传递之间的区别呢?值的传递实际上是否相同,但只是两种语言的引用/取消引用行为不同?

标签: javascriptcfunctionparametersparameter-passing

解决方案


C 通过值1传递所有内容。有时这些值是指针值;这与通过引用传递不同。

在真正的引用传递系统中,函数定义中的形式参数指定与函数调用中的实际参数相同的对象(假设实际参数不是数字文字,无论如何)。无论是通过使用指针还是在后台或通过不同的机制来完成,都是实现的功能。在 C 语言中从来没有这种情况。

中的表达式 *x指定与中foo的表达式相同的对象amain但形式参数x是与 中的不同对象a表达式 的结果&a按值传递并存储在唯一对象x中。

 x == &a // int * == int *
*x ==  a // int   == int


  1. 数组很奇怪。除非它是sizeof或一元运算符的操作数&,或者是用于在声明中初始化字符数组的字符串字面量,否则“N 元素数组”类型的表达式T将被转换(“衰减”)为键入“pointer to T”,表达式的值将是数组第一个元素的地址。当您将数组表达式作为参数传递给函数时,函数会接收指向第一个元素的指针,而不是整个数组的副本。因此,与其他参数类型不同,函数中数组参数内容的更改会反映在调用者中。然而,这仍然不是真正的引用传递。这只是 C 有点独特的数组语义的后果。


推荐阅读