细说值传递、引用传递和地址传递

简介: 细说值传递、引用传递和地址传递

细说值传递、引用传递和地址传递

1 实参和形参

形式参数:是在定义函数名和函数体的时候使用的参数,目的是用来接收调用该函数时传入的参数。

实际参数:在调用有参函数时,主调函数和被调函数之间有数据传递关系。在主调函数中调用一个函数时,函数名后面括号中的参数称为“实际参数”。

func main() {
   i := sum(2, 4) //2,4为实参
   fmt.Println(i)
}
func sum(a int, b int) int { //a,b为形参
   c := a
   return b + c //a,b,c为形参
}
复制代码

2 值传递、引用传递和指针传递:

值传递:指在调用函数时将实际参数复制一份传递到函数中,这样在函数中如果对参数进行修改,将不会影响到实际参数。

引用传递:指在调用函数时将实际参数的地址直接传递到函数中,那么在函数中对参数所进行的修改,将影响到实际参数。

指针传递:指在调用函数时将实际参数的指针地址直接传递到函数中,类似于引用传递,最大不同就是指针指向的类型不能为null。

指针传递和引用传递的不同:指针就是地址变量,所以引用相当于把地址常量作为参数,指针相当于把地址变量作为参数。

2.1 Go语言演示

type Obj struct {
   Id   int
   Name string
}
func main() {
  //值传递和引用传递测试
  fmt.Println("值传递...")
  v1 := 2
  v2 := Obj{2, "ls"}
  fmt.Println(v1, v2)
  updateVal(v1, v2)
  fmt.Println(v1, v2)
  //指针传递测试
  fmt.Println("指针传递...")
  v3 := 2
  v4 := Obj{2, "ls"}
  fmt.Println(v3, v4)
  updateValPoint(&v3, &v4)
  fmt.Println(v3, v4)
}
//值传递
func updateVal(v1 int, v2 Obj) {
   v1 = 1
   v2 = Obj{1, "zs"}
}
//引用传递
func updateValPoint(v1 *int, v2 *Obj) {
   *v1 = 12
   *v2 = Obj{1, "zs"}
}
复制代码

输出:

值传递...
2 {2 ls}
2 {2 ls}
指针传递...
2 {2 ls}
12 {1 zs}
复制代码

2.2 Java语言演示

public static void main(String[] args) {
    System.out.println("值传递1");
    int v1 = 2;
    String v2 = "zz";
    Obj v3 = new Obj(2, "ls");
    System.out.println(v1 + "--" + v2 + "--" + v3);
    updateValue(v1, v2, v3);
    System.out.println(v1 + "--" + v2 + "--" + v3);
    System.out.println("值传递2");
    int v4 = 2;
    String v5 = "zz";
    Obj v6 = new Obj(2, "ls");
    System.out.println(v4 + "--" + v5 + "--" + v6);
    updateValuePoint(v4, v5, v6);
    System.out.println(v4 + "--" + v5 + "--" + v6);
}
public static void updateValue(int v1, String v2, Obj v3) {
    v1 = 1;
    v2 = "ww";
    v3 = new Obj(1, "zs");
    v3.setId(1);
    v3.setName("zs");
}
public static void updateValuePoint(int v1, String v2, Obj v3) {
    v1 = 1;
    v2 = "ww";
    v3.setId(1);
    v3.setName("zs");
}
@AllArgsConstructor
@ToString
@Data
static class Obj {
    public int id;
    public String name;
}
复制代码

输出:

2--zz--Main.Obj(id=2, name=ls)
2--zz--Main.Obj(id=2, name=ls)
2--zz--Main.Obj(id=2, name=ls)
2--zz--Main.Obj(id=1, name=zs)
复制代码

3 总结下

在Java方法中参数列表有两种类型的参数,基本类型和引用类型。

基本类型:值存放在局部变量表中,无论如何修改只会修改当前栈帧的值,方法执行结束对方法外不会做任何改变;此时需要改变外层的变量,必须返回主动赋值。

引用数据类型:指针存放在局部变量表中,调用方法的时候,副本引用压栈,赋值仅改变副本的引用。但是如果通过操作副本引用的值,修改了引用地址的对象,此时方法以外的引用此地址对象当然被修改。(两个引用,同一个地址,任何修改行为2个引用同时生效)。

这两种类型都是将外面的参数变量拷贝一份到局部变量中,基本类型为值拷贝,引用类型就是将引用地址拷贝一份。

参考文章

www.cnblogs.com/lingyejun/p…

blog.csdn.net/belongtocod…


相关文章
|
机器学习/深度学习 自然语言处理 自动驾驶
深度学习的应用实例:重塑各个领域的未来
深度学习的应用实例:重塑各个领域的未来
596 0
|
SQL Java 数据库连接
mybatis 使用foreach时出现“The expression ‘list‘ evaluated to a null value“问题
mybatis 使用foreach时出现“The expression ‘list‘ evaluated to a null value“问题
1963 3
|
4月前
|
机器学习/深度学习 数据采集 人工智能
快瞳AI鱼类识别 —— AI赋能海洋生物智能监测
鱼类AI识别技术基于深度学习算法,通过大量鱼类图像训练,实现对鱼类的快速精准识别。该技术模仿人类视觉系统,利用卷积神经网络(CNN)提取鱼体特征,从浅层的鳞片纹理到深层的整体形态逐步分析。快瞳科技提出的MF-Net模型突破了鱼类种类繁多、数据不均衡等难点,通过多阶段特征融合、动态权重调整及三维特征建模,显著提升识别性能。这项技术不仅重塑水产科研方式,还为海洋生物多样性保护提供智能化解决方案,推动AI在生态保护领域的应用迈入新阶段。
|
前端开发
学习css的clip-path属性
【7月更文挑战第1天】了解CSS `clip-path`属性,用于定义元素显示区域的裁剪形状,如圆形、椭圆、多边形、矩形及SVG路径。通过配合过渡和动画,可创建动态交互效果。例如,`clip-path: circle(radius at center);`用于创建圆形裁剪,`polygon`用于自定义多边形。还可以使用`path()`引用SVG路径数据。[资源推荐:bennettfeely.com/clippy/](https://bennettfeely.com/clippy/),提供交互式工具测试不同形状。
378 0
学习css的clip-path属性
|
10月前
|
监控 Java Android开发
深入探讨Android系统的内存管理机制
本文将深入分析Android系统的内存管理机制,包括其内存分配、回收策略以及常见的内存泄漏问题。通过对这些方面的详细讨论,读者可以更好地理解Android系统如何高效地管理内存资源,从而提高应用程序的性能和稳定性。
370 16
|
人工智能 算法 数据可视化
DBSCAN密度聚类算法(理论+图解+python代码)
DBSCAN密度聚类算法(理论+图解+python代码)
2749 0
|
数据采集 Java API
使用阿里云接口(API)进行身份证实名认证
如今随着互联网产业的多元化发展,尤其是互联网金融,O2O,共享经济等新兴商业形式的兴起,企业对实名认证业务的数据形式和数据质量有了更高的需求。如今也衍生出身份证实名认证业务,通过接口将身份证号码、姓名上传至阿里云,再与全国公民身份信息系统进行匹配,判断信息的一致性。
15158 1
使用阿里云接口(API)进行身份证实名认证
|
存储 NoSQL 关系型数据库
深入探索地理空间查询:如何优雅地在MySQL、PostgreSQL及Redis中实现精准的地理数据存储与检索技巧
深入探索地理空间查询:如何优雅地在MySQL、PostgreSQL及Redis中实现精准的地理数据存储与检索技巧
2956 0
|
SQL 存储 数据库
SQL Server 中的备份类型详解
【8月更文挑战第31天】
406 0
|
弹性计算 监控 安全
【阿里云弹性计算】ECS实例监控与告警系统构建:利用阿里云监控服务保障稳定性
【5月更文挑战第23天】在数字化时代,阿里云弹性计算服务(ECS)为业务连续性提供保障。通过阿里云监控服务,用户可实时监控ECS实例的CPU、内存、磁盘I/O和网络流量等指标。启用监控,创建自定义视图集中显示关键指标,并设置告警规则(如CPU使用率超80%),结合多种通知方式确保及时响应。定期维护和优化告警策略,利用健康诊断工具,能提升服务高可用性和稳定性,确保云服务的卓越性能。
439 1