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
- C语言和java中传参内幕
- C语言随机数内幕
- C语言内存管理内幕
- 一句话C系列:C语言指针内幕
- C语言内存管理内幕(二)
- java语言和C语言的区别
- java语言和C语言的区别
- java语言和c语言的区别
- 多态的内幕--(C++, C)语言两个版本
- 『C语言』标准I/O内幕
- Java初探:浅谈Java语言和C语言的区别
- 深入java重载和重写的内幕
- Java和C语言哪个更快?
- C和Java哪种语言更好?
- Java和C语言,c++的区别
- Java和C语言,c++的区别
- C语言和JAVA哪个比较好啊
- 字母图形(C语言和java)
- 密码原来如此重要
- 收集到的一些样式之二
- Android使用WebView浏览网页
- MFC——文件打开和保存对话框(CFileDialog)
- 深入理解计算机系统 家庭作业 2.94
- C语言和java中传参内幕
- [NOI2004]郁闷的出纳员
- 8种web监听器详解
- Android 软件测试日志文件抓取
- OpenCV自带的CamShift算法解读
- Servlet容器的分类之我的学习
- c++标准库容器使用概览
- 【LeetCode】Sort Colors
- 隐藏或者显示MacBook 里的隐藏文件