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
分享到:
评论