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
分享到:
相关推荐
经典算法 C语言和Java实现经典算法 C语言和Java实现经典算法 C语言和Java实现经典算法 C语言和Java实现经典算法 C语言和Java实现经典算法 C语言和Java实现经典算法 C语言和Java实现经典算法 C语言和Java实现经典算法...
在C语言中调用java语言的方法!对初学者很不错的实例!Android jni开发之C语言调用java语言
浅析C语言和Java语言的异同.pdf
大学生实战入门 计算机二级项目实战包含C语言和java. 计算机二级项目实战包含C语言和java. 计算机二级项目实战包含C语言和java. 计算机二级项目实战包含C语言和java. 计算机二级项目实战包含C语言和java.
C语言和java的经典算法实现 各种排序 矩阵问题 经典背包八皇后等等
C语言调用JAVA的例子,一个用C语言如何调用JAVA的例子,调用里面的方法 一个用C语言如何调用JAVA的例子,调用里面的方法 一个用C语言如何调用JAVA的例子,调用里面的方法 一个用C语言如何调用JAVA的例子,调用里面的方法 ...
堆排序堆排序C语言和java语言
本资源详细用c语言跟java写出了计算机界的经典算法,并且对算法的好坏做了比较!
C语言及JAVA编程题:其中包含进200个例子,难易融合,适合C语言学习或者Java学习的初学者,也适合想提升自己能力的编程者!
android平台下基于java语言的md5加密及ndk环境下基于c语言的md5加密。
一个java语言写的客户端连接C语言写的socket服务器根据tcp进行通信和文件发送
编译原理课程的最终实验,内容包含了C语言为宿主语言的Java词法分析器和语法语义分析,两部分的源代码和测试用例和实验报告。
NDK开发之C语言调用Java构造方法、父类方法、返回中文字符串乱码问题案例详细解析。
详细介绍了NDK开发中C语言如何获取java层对象的属性,如何调用java层的方法。
在JAVA和C语言系列中++和一都是一个非常重要的算术运算,我们叫它自加和自减。它组成表达式的形式多样,使用灵活,在学习中,学生又感觉非常不好学,难以理解,但它可以简短程序,使用频率高,要学好这些语言,又...
java调用c,总结了各种类型
链表 概念、链表的优势、链表的c语言和java语言的实现
在java中调用C语言的函数,对初学者很不错的实例! 在java中调用C语言的函数,对初学者很不错的实例!
跪求C语言转JAVA
Java和C语言实现各种经典算法 能使编程效率大大提高