JAVA引用和C语言指针的探究

首先在C语言中,函数的内存都是分配在栈中的,当该函数执行完之后,该函数所占用的内存就会被回收掉C语言有跨函数使用的一种功能,而实现这种功能的就是指针。这种功能的优点是使用malloc函数来进行动态分配内存,而所分配的内存是存放在堆中的,故当函数执行完之后,使用动态分配的内存是不会被回收掉的.例如:

int  sum (int a, int * b)

{

   k= (int *b)malloc( sizeof(int) );

  int c= a;

 }


当函数sum执行完之后,指针b所指向的内存是不会被回收掉的,但是指针b本身是会被回收的,指针本身占用4个字节,作为形参来进行传递,只是传递的是变量的地址而已。


仅仅一个简单程序,有可能比较难懂。因为指针的值是其它变量的内存地址,而指针本身也是一个变量,但因为它拥有其它变量的内存地址,那么它就可以操作这个地址进行分配内存空间。而这个空间的分配不是分配给该指针自己,也是分配给该指针的所拥有其它变量的内容地址,它自己作为一个变量在函数执行完后还是要被系统回收的。在java中也是类似的。


        JAVA中,实际上每一个new 语句返回的都是一个指针的引用,因此对象是可以在函数中进行传递的,也就是引用传递。


java中,基本类型数据存放在栈中,存放的是数据。而产生对象时,只把对象的引用存放在栈中,用于指向某个对象,对象本身存放在堆中。


调用方法时传递的参数以及在调用中创建的临时变量都保存在栈中,速度较快。其它变量,如静态变量、实例变量等,都在堆中创建,速度较慢。另外,依赖于具体的编译器JVM,局部变量还可能得到进一步优化。


         通过以上的了解之后,现在我们详谈一下JAVA引用和C语言指针的区别:


1.从现象上看:指针在运行时可以改变其所指向的值,而引用一旦和某个对象绑定后就不再改变,总是指向最初的对象.


2. 从编译上看:程序在编译时分别将指针和引用添加到符号表上,符号表上记录的是变量名及变量所对应地址。指针变量在符号表上对应的地址值为指针变量的地址值,而引用在符号表上对应的地址值为引用对象的地址值。符号表生成后就不会再改,因此指针可以改变指向的对象(指针变量中的值可以改),而引用对象不能改。


3.从类型上看:引用其值为地址的数据元素,java封装了的地址,可以转成字符串查看,长度可以不必关心;C指针是一个装地址的变量,长度一般是计算机字长,可以认为是个int


4:所占内存:所占内存:引用声明时没有实体,不占空间。C指针如果声明后会用到才会赋值,如果用不到不会分配内存。


5.内存溢出:JAVA引用的使用权限比较小,不会产生内存溢出。C指针是容易产生内存溢出的,所以程序员要小心使用,及时回收。


6. 从本质上将:JAVA中的引用和C中的指针本质上都是想通过一个别名,找到要操作的目标(变量对象等),方便在程序里操作。所不同的是JAVA的办法更安全,使用更加方便些,但没有了C的灵活,高效。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值