C语言和java中传参内幕

来源:互联网 发布:淘宝好评怎么删除图片 编辑:程序博客网 时间:2024/05/19 20:42

C语言传参知识:

    首先需要了解的是C语言的传参方式,学过C语言的,应该知道其传参其实是传递实参的副本(任何参数都是)。

    结构struct由众多类型结合在一起,所占的内存比较大,传递结构时,需要复制及加载副本的内存,运行效率降低了及占用内存空间比较大。通常我们的解决方法是,将结构的指针传过去(正确地说是将其结构指针的副本,注:指针和指针的副本指向的地址是一样的,所以它们的作用是一样的),如果不想让函数改变原结构,可以在形参那里将指针声明为const。例如:被调用函数可以写成:

</pre><p style="font-size:18px;"><pre name="code" class="cpp">int functiontest(struct structName const *pmenber){//content    }

这样函数里面就不能改变结构的原内容了(达到传递副本一样的效果)。
另一种写法:

int functiontest(struct structName *const pmenber){//content    }

这表示指向结构的常量指针,而不是指向常量结构的指针,这样可以自由改变结构本身,但不能修改存储在指针中的地址。



java的传参知识:

    同样,java的参数分两种,基本数据类型和对象类型(从虚拟机的角度看,前者存储在栈中,后者存储在堆中)。
    java是没有结构的,也没有指针,但是有对象,对象同样是很占内存的,所以在解决java传参时,它是这样处理的:基本数据类型传递的是实参的副本,对象类型传递的是引用(相当于指针,所以在调用的函数中改变了对象实例,原来的也是改变了的)。
    实例证明:

A类:

public class A { int i=1;}
B类:
public class B { B(A a){a.i+=1;}}

Test类(运行类):

public class Test {public static void main(String[] args) {A a = new A();B b = new B(a);B b1 = new B(a);B b2 = new B(a);System.out.println(a.i);}}

结果是:4

说明原来的实例对象 a 每调用一次,就改变一次。


另一种情况:

B类:

public class B { B(Integer i){i+=1;}}
Test类:

public class Test {public static void main(String[] args) {int i = 1;B b = new B(i);B b1 = new B(i);B b2 = new B(i);System.out.println(i);}}
结果是:1

说明传参时传递的只是 i 的副本,无论调用函数里面如何改变 i 的值,原来的 i 是不变的。


    所以,在形参上声明 final 只对对象类型参数有效,对基本数据类型声明是无意义的,因为它的目的是为了防止函数改变原实参的内容。 



转载请标明原文出处:http://blog.csdn.net/u012367513/article/details/24672373



9 0
原创粉丝点击