C++&JAVA指针的对比

C C++中的指针,提供了很大的灵活性,但是灵活也带来了危险,对指针操作的不当容易造成内存泄露或是空悬指针等问题。

Java取消了指针。但实际上,java中声明的所有引用数据类型的名称,可以理解为就是一个指针。该名称存储在栈内存上,指向对内存上使用new开辟的空间。
如:
int[] array = new int[10]
整型数组名array在栈内存上,在堆内存上开辟了10*4字节的空间,用array指向该块内存。
可以把array理解为一个指针,里面存放的地址就是new出来的空间。
如:
class Person{
……
}
Person p = new Person() ;
对象名p开辟在栈内存,用new为对象在堆内存开辟空间,对象名p指向该堆内存。

但实际上呢,该名称并不像C++中的指针,特别是在进行参数传递的时候。
java已经声明:参数传递都是值传递。
但是当引用数据类型作为函数参数的时候,把一个已声明的对象p1传进来的时候,其实是产生了一个该对象的副本p2,这个p2指向p1,所以通过p2调用p1的成员时,可以完成修改,等函数调用结束,保留修改。如:
class Person{
public String name ;
public int age ;
public Person(String name ,int age){
this.name = name ;
this.age = age ;
}
}

public class Test{
public static void main(String[] args){
Person p = new Person("张三" , 10) ;
System.out.println("修改前-->姓名:"+ p.name+",年龄:"+p.age) ;
changePro(p) ; //对象p传进来,这时产生p的一个副本,假设是p1,它指向p。 //通过这个副本p1,可以调用p的成员。
System.out.println("修改后-->姓名:"+ p.name+",年龄:"+p.age) ;
}

public static void changePro(Person p){ //通过副本可以调用原对象的成员
p.name = "李四" ;
p.age = 30 ;
}
}
结果:
修改前-->姓名:张三,年龄:10
修改后-->姓名:李四,年龄:30

但当你把p1传进来之后,产生副本p2,然后试图通过p2来改变p1的指向,显然是不可能的,这时改变的仅仅是p2的指向,函数调用结束之后,p1的指向不变。如:
class Person{
public String name ;
public int age ;
public Person(String name ,int age){
this.name = name ;
this.age = age ;
}
}

public class Test{
public static void main(String[] args){
Person p = new Person("张三" , 10) ;
System.out.println("修改前-->姓名:"+ p.name+",年龄:"+p.age) ;
changeObj(p) ; //对象p传进来,这是产生p的一个副本,假设是p1,它指向p。 //在函数中,改变的只是这个副本的指向。
System.out.println("修改后-->姓名:"+ p.name+",年龄:"+p.age) ;
}

public static Person newP = new Person("李四", 30) ;

public static void changeObj(Person p){
p = newP ; //企图改变指向,实际改变的是副本的指向,
//函数结束后,原对象的指向不会改变
}
}
结果:
修改前-->姓名:张三,年龄:10
修改后-->姓名:张三,年龄:10
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值