`
二当家的
  • 浏览: 25742 次
文章分类
社区版块
存档分类
最新评论

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



分享到:
评论

相关推荐

    经典算法 C语言和Java实现

    经典算法 C语言和Java实现经典算法 C语言和Java实现经典算法 C语言和Java实现经典算法 C语言和Java实现经典算法 C语言和Java实现经典算法 C语言和Java实现经典算法 C语言和Java实现经典算法 C语言和Java实现经典算法...

    数据结构学习的代码,包括c语言和java语言.zip

    数据结构学习的代码,包括c语言和java语言数据结构学习的代码,包括c语言和java语言数据结构学习的代码,包括c语言和java语言数据结构学习的代码,包括c语言和java语言数据结构学习的代码,包括c语言和java语言数据...

    浅析C语言和Java语言的异同.pdf

    浅析C语言和Java语言的异同 本文对C语言和Java语言的异同进行了比较和分析,从它们的起源、特点、开发环境、程序调试过程、应用领域等方面进行了比较和归纳。 1. 起源 C语言是在1970年代初由贝尔实验室的两位...

    C语言调用java语言方法

    "C语言调用java语言方法"是一个典型的跨语言通信场景,主要应用于Android平台上的JNI(Java Native Interface)开发。JNI允许Java代码和其他语言(如C/C++)进行无缝交互,提升性能或者利用已有的库资源。 首先,...

    C语言,java经典算法

    在编程领域,C语言和Java都是非常重要的编程语言,它们各自有着独特的特性和应用范围。C语言以其高效、灵活和贴近硬件的特点,常被用于系统级编程、嵌入式开发以及高性能计算;而Java则以其“一次编写,到处运行”的...

    c语言与java 经典算法实现

    本资源"《C语言与Java 经典算法实现》"聚焦于这两门广泛使用的编程语言,通过它们来阐述和实现经典的算法。下面将详细讨论其中涉及的主要知识点。 首先,我们来关注排序算法。排序是计算机科学中最基础也是最重要的...

    计算机二级项目实战包含C语言和java

    大学生实战入门 计算机二级项目实战包含C语言和java. 计算机二级项目实战包含C语言和java. 计算机二级项目实战包含C语言和java. 计算机二级项目实战包含C语言和java. 计算机二级项目实战包含C语言和java.

    C代码,跪求C语言转JAVA

    跪求C语言转JAVA

    android平台基于ndk c语言和java语言的md5加密

    本主题主要探讨如何在Android中结合Java和NDK(Native Development Kit)使用C语言实现MD5加密。 MD5是一种广泛使用的哈希函数,它将任意长度的数据转化为固定长度的128位(16字节)摘要,通常以32位十六进制数的...

    C语言实现的Java编译器

    在本项目中,"C语言实现的Java编译器"是一个独特的尝试,它将传统的编译原理理论应用于实际编程中,以C语言作为基础来构建一个能够解析和处理Java源代码的工具。这个项目主要涉及两个核心部分:词法分析器(Scanner...

    基于C语言的java词法分析器

    总之,基于C语言的Java词法分析器项目涵盖了编译原理中的核心概念,如正则表达式和有穷自动机,同时也涉及C语言的实际编程技巧。通过深入理解并实践这个项目,开发者不仅可以提升C语言编程能力,还能对编译器的工作...

    比较教学法在C语言和JAVA程序设计课程中的运用.pdf

    在探讨比较教学法在C语言和JAVA程序设计课程中的运用这一话题时,我们需要先对比较教学法进行细致的分析,然后结合C语言和JAVA这两种编程语言的特点,来讨论比较教学法的具体应用和所带来的教学效果。 首先,比较...

    java和c语言tcp通信和文件传送

    一个java语言写的客户端连接C语言写的socket服务器根据tcp进行通信和文件发送

    C语言与Java对比下的优点.pdf

    C语言和Java作为编程领域中两大主流语言,各有其特点和优势。为了详细探讨这两种语言,下面将对C语言和Java的不同方面进行详细对比。 一、编程语言概述 C语言和Java均是目前编程中非常重要的语言。从历史数据来看,...

    Java和C语言的对比.pdf

    Java和C语言的对比 Java和C语言是两种常用的编程语言,它们在编程思想、语法、应用场景等方面存在一定的差异。在本文中,我们将从编译机制、数据类型、开发环境等方面对Java和C语言进行对比学习。 一、编译机制 ...

    Java和C语言实现各种经典算法

    Java和C语言都是广泛使用的编程语言,它们各有特点,但都能有效地实现各种算法。本资源包包含了用Java和C语言实现的各种经典算法,旨在帮助程序员深入理解算法原理,并提高编程实践能力。 Java是一种面向对象的、跨...

    C语言 C++ java 三种语言 杨辉三角形的实现代码

    在C语言、C++和Java这三种不同的编程语言中实现杨辉三角形的打印,可以展示不同语言的语法特性以及编程思维。 首先,我们来看C语言的实现,文件名为"yang.c"。C语言以其简洁和高效著称,它的实现通常会利用二维数组...

    省赛国赛蓝桥杯C语言与java(B组)题库答案

    蓝桥杯程序设计竞赛是一项备受瞩目的IT赛事,旨在提升大学生的编程技能和创新思维,尤其是在C语言和Java这两种主流编程语言上的应用。比赛分为不同的组别,B组是其中的一个,面向不同水平的参赛者提供了挑战。这个...

    C语言与Java的区别2共1页.pdf.zip

    标题中的"C语言与Java的区别2共1页"表明这是一个关于比较C语言和Java两种编程语言差异的文档,可能是一个简短的概述或者关键点的总结。由于描述与标题相同,我们可以推断文档专注于这两个编程语言的核心不同之处。...

    C语言99乘法表,适应于C语言,JAVA语言

    这个题目涉及到的主要知识点是C语言和JAVA语言中的循环控制以及字符串处理。 首先,我们来看C语言和JAVA语言的共同之处。无论是C语言还是JAVA,它们都是面向过程的编程语言,都支持for循环这种控制结构。在99乘法表...

Global site tag (gtag.js) - Google Analytics