java 引用和c指针问题

来源:互联网 发布:ipa软件下载 编辑:程序博客网 时间:2024/06/06 20:23

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的灵活,高效。


总之:本人的思考是指针比引用多了一个解地址 对指针引用的理解不要死死在语法上而是在内存上 在实现上理解 引用是和对象并在一起的至于通过什么方式连在一起 。。求大神告知了。。  但是 作用上其实基本就是一样的 都是为了对对象的操作。

转载自:http://blog.csdn.net/guo18735177413/article/details/42705961


0 0