zoukankan      html  css  js  c++  java
  • 值传递和引用传递

    今天在看JavaScript中参数的定义时做的笔记

    --ECMAScript中的所有参数传递都是值传递,不可能通过引用传递参数
    --包括引用类型,也只是传递了所引用的值,而不是参数本身的引用
    --通过传递的引用的值可以修改引用类型的值
    --但是无法修改参数本身的引用

     --初看时会觉得很疑惑,难道和我之前学过的c,java,php不一样吗

     --对象,数组在函数中的传递不是 “引用传递” 吗?怎么也成了值传递?

     --反应了半天后,才明白,其实是我之前一直理解错了

     --对象,数组在一般函数中的传递其实是值传递的,只有c语言的&引用传递,才是真的引用传递

    值传递

    对于一个对象,或者数组,生命初始化给一个变量,其实是把这个对象,数组的引用赋值给这个变量

    var a = [1,2,3];
    var b = a;
    b[0] = 2;
    a     //2,2,3

    我们通过这个引用可以修改这个数组或是对象,这里没问题把

    当我们通过变量向函数传递数组或对象时,其实传递的也只不过是这个变量所保存的值,而这个值代表数组或是对象的引用;

    引用类型变量的赋值,也是把这个值(引用)拷贝给另一个变量而已

    function f(x) {
        x[0] = 5;
        x = new Array();
        x[0] = 3;
        x[1] = 2;
        
    }
    var a = [1, 2, 3];
    f(a);
    a    //[5, 2, 3]

    因为我们传递的只是这个变量的值(这个值是数组的引用),这个参数x接受了这个值(这个值是数组的引用)

    所以我们可以通过内部的参数对这个引用进行修改,通过变量a访问数组也会返回被修改后的结果

    但是当我们试图去修改参数x的值(这个值是数组的引用),让他指向一个新的数组时,

    只是修改的参数x的值(这个值是数组的引用),而不会影响变量a的值(这个值是数组的引用)

    以上就是所谓的值传递

    引用传递

    将所传递的变量的地址传递给函数,此时参数就是这个变量的一个别名

    对这个参数进行修改,就是对这个原变量进行操作

    典型的引用传递就是c语言的&(取地址)操作

     1 #include <stdio.h>  
     2 void swap(int& a, int& b)
     3 {
     4     int tmp;
     5     tmp = a;
     6     a = b;
     7     b = tmp;
     8 }
     9 
    10 int main()
    11 {
    12     int i = 3, j = 4;
    13     printf("before swap:i=%d,j=%d
    ", i, j);
    14     swap(i, j);
    15     printf("After  swap:i=%d,j=%d
    ", i, j);
    16     return 0;
    17 }

    此处参考博客 值传递和引用传递-----函数参数传递的两种方式

  • 相关阅读:
    Product of Array Except Self
    如果裸写一个goroutine pool
    fasthttp 的 goroutine pool 实现探究
    golang实现权重轮询调度算法
    golang学习资料
    获取本机ip
    dnscache --源码笔记
    xsrftoken--源码笔记
    forwardport--源码笔记--注释
    golang 通过exec Command启动的进程如何关闭的解决办法 以及隐藏黑色窗口
  • 原文地址:https://www.cnblogs.com/loveluking/p/9432664.html
Copyright © 2011-2022 走看看