如何描述这两种传值方式的区别?

问题描述 投票:0回答:1

这就是我所理解的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中的一个结构?),对 x 里面 foo 将反映在主的范围内。即使整个对象被替换.

在JavaScript中,基元只是简单的复制一下,这个道理很简单。

但是对于对象,IIUC,它们的内存地址(或等价物)的值被提供给函数 foo,表面上听起来和上面的C代码很相似。然而,如果我们给参数 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指针)也被复制到函数中。那么如何描述pass-by-reference和pass-by value的区别呢?其实传值的方式是一样的,只是两种语言的引用行为不同?

javascript c function parameters parameter-passing
1个回答
1
投票

C语言传递 一切 按价值1. 有时这些值是指针值;这与通过引用的方式是不同的,在真正的通过引用系统中,函数定义中的形式参数与函数调用中的实际参数是同一个对象(假设实际参数不是数字文字)。

在真正的传递引用系统中,函数定义中的形式参数与函数调用中的实际参数指定了同一个对象(假设实际参数不是数字文字)。 至于是通过使用指针还是在引擎盖下还是通过其他机制来实现,则是实现的函数。在C语言中从来没有这种情况。

在C语言中,这种情况是绝对不会发生的。表情 *xfoo 指定与表达式相同的对象 amain但形式参数 x 是一个独立于 a. 结果 表情 &a 是通过值传递的,并存储在唯一的对象中。x.

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


  1. 数组很奇怪。 除了当它的操作数是 sizeof 或单利 & 运算符,或者是一个字符串文字,用于在声明中初始化一个字符数组,一个是 表情 类型为 "N-元素数组的 T"将被转换("衰减")为 "指针到 "类型的表达式。T",表达式的值将是数组中第一个元素的地址。 当你把一个数组表达式作为参数传递给函数时,函数接收的是指向第一个元素的指针,而不是整个数组的副本。 所以与其他参数类型不同,函数中数组参数内容的变化会反映在调用者身上。 但是,这仍然不是真正的传递引用。 这只是C语言独特的数组语义带来的后果。

© www.soinside.com 2019 - 2024. All rights reserved.