java代码:
public class Test{
static int e; // 默认是0
static String f; //默认是null
public static void main(String[] args) {
int a = 0;
char [] b = {'a','b','c'};
String c = "hello";
Person d = new Person();
new Test().TestParameter(a, b, c, d, e);
System.out.println("a="+a);
System.out.println("b="+b[0]+b[1]+b[2]);
System.out.println("c="+c);
System.out.println("d="+d.id+d.name);
System.out.println(e);
System.out.println(f);
}
public void TestParameter(int a, char[] b,String c, Person d,int e){//这里的 Person d 相当于c中的 Person *d
a++; //a = a+1; 现在的a指向的不是刚开始传入的a的地址了,原来的a还是那个数
b[2] = 'e'; //地址没有变,操作的就是b本身
c="abc";//一赋值,就表示c重新指向新的地址,新地址的内容是"abc",原来的数据没变
d.id=3;//地址没变,数据会被修改
d.name = "tom";
e = 2;
f = "ffff";
//注意:如果参数出现被赋值的情况,说明现在的参数地址已经改变,之后的操作都是对新地址的操作,刚开始传入的数据并没有动。
}
}
c代码:
#include <stdio.h>
typedef struct Person
{
int id;
char name[10];
}Person , *Per;
//形参是指针类型的,那么形参和实参都指向同一块数据域,形参和实参的地址是相同的,形参改变,实参也会改变
//形参是普通类型的,当实参传入时,形参操作的是实参复制出来的另一份数据域,形参和实参的地址不同,形参改变,实参不受影响
void func(Person p1, Person *p2, int a1, int *a2)
{
p1.id = 10;
strcpy(p2->name,"jerry");
a1 = 12;
*a2 = 23;
}
//形参是地址类型的,形参改变,实参也会改变
void func02(Person &p){
}
void main(){
struct Person p1;
struct Person p2;
int a1 = 1;
int a2 = 2;
p1.id = 01;
strcpy(p1.name,"tom01");
p2.id = 02;
strcpy(p2.name,"tom02");
func(p1,&p2,a1,&a2);
func02(p); // 这里传入的是普通类型,如果p是指针类型的,需要*p这么传
printf(" a1=%d a2=%d p1.id=%d p2.name=%s
",a1,a2,p1.id,p2.name);
}