值传递
特点:
- 形参是实参的拷贝,改变形参的值并不会影响外部实参的值。
当函数内部需要修改参数,并且不希望这个改变影响调用者时,采用值传递。
指针传递
特点:形参为指向实参地址的指针,当对形参的指向操作时,就相当于对实参本身进行的操作
- 方法里,用*a 操作指针
-
为什么用&修饰实参
这就跟&和*在修饰变量名时的作用有关
&b 取b的值地址,它被定义为取地址运算符
- a 取a的值 ,它被定义为*间接寻址运算符,返回操作数所指定地址的变量的值
在指针传递中,传入地址&b,然后在该函数中,通过*a取出&b的地址的值,再进行相关操作。有点绕,但还算可以理解。
引用传递
特点:
- 形参相当于是实参的“别名”,对形参的操作其实就是对实参的操作
- 行参作为局部变量在栈中开辟了内存空间,并指向实参变量的地址
-
指针和引用的区别
指针和引用都可以通过行参改变实参的值,那么它们到底什么区别呢?
其实这个跟引用规则有很大的关系,来看下引用的规则: 引用被创建是必须初始化
- 不能有NULL引用
- 一旦应用被初始化,就不能改变引用关系
而指针以上规则都没有限制,那是为什么呢?其实指针传递本质上是值传递的方式,它所传递的是一个地址值。其实很多人对这个都不太好理解,你可以这么理解,我们都知道Java多线程中,操作共享内存的变量时,其实都是从共享内存中copy到自己的内存区域中,相当于一个副本,最终操作完以后再同步到共享内存中,达到一个闭环,你可以这么理解指针,但它原理并不是我说的这样,仅供辅助理解。
该如何选择
你可以将指针作为更加灵活的引用使用,当不满足引用规则的时候就使用指针,就这样。