转载

java的引用与c的指针之间的区别

相信大部分初学java的人都会有的疑惑,引用与指针究竟有什么区别呢?

先来看一个 c语言中的交换函数

 1 #include "stdio.h"  2 void swap(int *a,int *b)  3 {  4     int temp=*a;  5      *a=*b;  6     *b=temp;  7 }  8 main()  9 { 10     int a=1,b=2; 11     swap(&a,&b); 12     printf("%d %d",a,b); 13 }

很简单  只要用指针传一个地址进去  但java中没有指针 怎么办?

只能创建对象实现 或者 借助数组  没有指针来的这么方便

 1 public class Swaptest {  2       3     public int a;  4     public int b;  5   6     public static void main(String[] args) {  7           8         Swaptest s =new Swaptest();  9         s.a=1; 10         s.b=2; 11         Change(s); 12         System.out.println(s.a+" "+s.b); 13     } 14     public static void Change(Swaptest i){ 15         int temp=i.a; 16         i.a=i.b; 17         i.b=temp; 18     } 19 }

看到这里 也许有人会说 Integer 不也是引用类型吗 为什么不能直接用它来传  我们可以看一下

 1 public class Swaptest {  2       3   4     public static void main(String[] args) {  5           6   7         Integer a=1,b=2;  8         Change(a,b);  9         System.out.println(a+" "+b); 10     } 11     public static void Change(Integer a,Integer b){ 12         Integer temp=a; 13         a=b; 14         b=temp; 15     } 16 }

输出结果还是 1 2

这是为什么呢?

我们再来看一个例子

 1 public class Swaptest {  2       3   4     public static void main(String[] args) {  5           6   7         Integer a=1,b;  8         b=a;  9         b=2; 10  11         System.out.println(a+" "+b); 12         System.out.println(a==b); 13     } 14  15 }

你们可以猜一下输出结果是什么

结果是

1 2false

为什么?

因为Integer是封装类的  是不可变的

当b赋值为2的时候  并不是去修改b所指的地址里的值  而是 新建一个空间 存为2 并让b指向它

java的引用与c的指针之间的区别

那么引用比指针好在哪里呢?

使程序更加安全  java给你规定好了哪里能用 哪里不能用

但是受束缚  没指针这么灵活

正文到此结束
Loading...