C语言和java中传参内幕

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



  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值