码迷,mamicode.com
首页 > 编程语言 > 详细

Java和C参数传递方式的比较

时间:2015-06-28 23:03:34      阅读:174      评论:0      收藏:0      [点我收藏+]

标签:

java中的形参是复制实参的一份拷贝(对于引用类型则是复制引用的拷贝,在栈中的拷贝),所以在函数中改变形参是无法改变实参的值的,改变引用只是将形参所代表的引用指向另外的新的对象,而实参的引用还指向原来的对象,改变形参引用的成员当然会影响实参引用成员的值,因为他们的引用都指向同一个对象。【Java只有值传递Java只有值传递Java只有值传递,重要的事情说3遍】

示例代码:

public class ExchangeValue {

	public static void main(String[] args) {
		int a = 0;//基本数据类型
		String str = "str";//String
		StringBuffer sb = new StringBuffer("sb");//引用数据类型
		System.out.println("a = "+ a +", str = " + str + ", sb = " + sb);
		ExchangeValue.exchange(a, str, sb);
		System.out.println("a = "+ a +", str = " + str + ", sb = " + sb);
	}
	
	static void exchange(int a, String b, StringBuffer c){
		a = 1;
		b = "newStr";
		c.append(" changed");
		System.out.println(c);
		c = new StringBuffer("newSb");
		System.out.println(c);
	}
}

 先自己想一想,所有代码结果均在最下方。

C语言函数参数传递方式1:值传递

示例代码:

void Exchg1(int x, int y) 
{
  int tmp;
  tmp=x;
  x=y;
  y=tmp;
  printf(“x=%d,y=%d/n”,x,y)
}
void main()
{
  int a=4,b=6;
  Exchg1 (a,b) ;
  printf(“a=%d,b=%d/n”,a,b)
}

C语言函数参数传递方式2:地址传递

示例代码:

Exchg2(int *px, int *py)
{
  int tmp=*px;
  *px=*py;
  *py=tmp;
  print(“*px=%d,*py=%d/n”,*px,*py);
}
main()
{
  int a=4;
  int b=6;
  Exchg2(&a,&b);
  Print(“a=%d,b=%d/n”, a, b);
}

C语言函数参数传递方式3:引用传递【变量的别名,对别名操作就是对变量本身操作】

示例代码:

Exchg3(int &x, int &y) //注意定义处的形式参数的格式与值传递不同
{
   int tmp=x;
   x=y;
   y=tmp;
  print(“x=%d,y=%d/n”,x,y);
}
main()
{
  int a=4;
  int b=6;
  Exchg3(a,b);  //注意:这里调用方式与值传递一样
  Print(“a=%d,b=%d/n”, a, b);
}

附一段自认为比较好的C指针介绍:

  变量a 本质上代表一个存储单元。CPU通过该存储单元的地址访问该存储单元中的数据。所以a本来代表两个值:存储单元的地址和储单元中的数据。于是就有了二异性。为了消除这种二义性,C语言规定a表示存储单元中的数据,而&a表示存储单元的地址。

  a存储单元中的数据可以是一个普通数值,也可以是另一个存储单元的地址,比如:a = &b; 语句就是将b的存储单元的地址存入a存储单元中。 C语言规定*a代表a中存储的地址对应的存储单元中的数据,也就是访问*a就等于访问b,于是*a提供了通过a访问b中的数据的手段。
  a表示a对应的存储单元中的数据。
  &a表示a对应的存储单元的地址。
  *a表示:首先,要求a对应的存储单元中的数据一定是另一个存储单元的地址。
            于是,*a表示另一个存储单元中的数据。
  当a声明的类型是int时,a中存储的是一个整数数值,通过a可以访问(读取或修改)这个数值。
  当a声明的类型是int*时,a中存储的是一个存储单元的地址,而该存储单元中存储的数据是一个整数数值;通过*a可以访问(读取或修改)这个数值。      

  a == &*a 都是该存储单元的地址。
  当a声明的类型是int**时,a中存储的是一个存储单元的地址,而该存储单元中存储的数据是另外一个存储单元的地址,另外这个存储单元中存储的是一个整数数值;通过**a可以访问(读取或修改)这个数值。
  最后,在C语言里地址叫指针。

Java片段运行结果:

a = 0, str = str, sb = sb
sb changed
newSb
a = 0, str = str, sb = sb changed

C1运行结果:

x=6 , y=4 

a=4 , b=6

C2运行结果:

*px=6,*py=4

a=6,b=4

C3运行结果:

x=6, y=4

a=6, b=4

Java和C参数传递方式的比较

标签:

原文地址:http://www.cnblogs.com/niceToString/p/java-c-method-arg-transfer-compare.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!