1. JAVA
基本数据类型:作为值传递,改变形参不会影响实参。当基本数据类型作为参数传递时,传递的是实参值的副本,即传的是值,无论在函数中怎么操作这个副本,实参的值是不会被改变的。
当对象作为参数传递时:实际上传递的是一份“引用的拷贝”。
引用,可以理解为指针,在主函数中是实参;
引用的拷贝,传递给子函数,是形参;
所以引用在传递给子函数时,是copy版的原指针(对象的地址),不是真正的实参。
当实参和形参指向同一对象时,通过形参修改对象可以影响主函数中的对象;
但是当形参在子函数中被重新指向另一对象(修改了形参即copy版的原指针),再通过形参修改对象就不会影响到主函数中的对象了!
Examples:
public class test {
public static void main(String[] args) {
StringBuffer sb = new StringBuffer("Hello ");
System.out.println("before change, sb is "+sb.toString());
change(sb);
System.out.println("after change, sb is "+sb.toString());
}
public static void change(StringBuffer stringBuffer){
stringBuffer.append("world !");
}
}
程序的运行结果:
before change, sb is Hello
after change, sb is Hello world !
public class test {
public static void main(String[] args) {
StringBuffer sb = new StringBuffer("Hello ");
System.out.println("before change, sb is "+sb.toString());
change(sb);
System.out.println("after change, sb is "+sb.toString());
}
public static void change(StringBuffer stringBuffer){
stringBuffer = new StringBuffer("Hi ");
stringBuffer.append("world !");
}
}
运行程序后,结果:
before change, sb is Hello
after change, sb is Hello
2. C
一是传递结构体变量,这是值传递,二是传递结构体指针,这是地址传递,三是传递结构体成员,当然这也分为值传递和地址传递。以传值方式传递结构需要对整个结构做一份拷贝。
结构体变量的值传递:
函数的形参直接copy实参结构体,所以在函数内改变形参并不会影响主函数中的结构体。
结构体变量的地址传递:
传进去函数的形参是指针,即对象的地址。定义函数时,func(*Q);在main中定义一个对象Q,调用函数时,func(&Q)。
Examples:
1.下面传递结构体变量
#include<stdio.h>
#include<string.h>
#define format "%d\n%s\n%f\n%f\n%f\n"
struct student
{
int num;
char name[20];
float score[3];
};
void change( struct student stu );
int main()
{
struct student stu;
stu.num = 12345;
strcpy(stu.name, "Tom");
stu.score[0] = 67.5;
stu.score[1] = 89;
stu.score[2] = 78.6;
change(stu);
printf(format, stu.num, stu.name, stu.score[0], stu.score[1],stu.score[2]);
printf("\n");
return 0;
}
void change(struct student stu)
{
stu.score[0] = 100;
strcpy(stu.name, "jerry");
}
可以看到最终输出的值并未改变。。。
2.地址传递
#include<stdio.h>
#define format "%d\n%s\n%f\n%f\n%f\n"
struct student
{
int num;
char name[20];
float score[3];
};
void change( struct student* stu );
int main()
{
struct student stu;
stu.num = 12345;
strcpy(stu.name, "Tom");
stu.score[0] = 67.5;
stu.score[1] = 89;
stu.score[2] = 78.6;
change(&stu);
printf(format, stu.num, stu.name, stu.score[0], stu.score[1],stu.score[2]);
printf("\n");
return 0;
}
void change(struct student* p)
{
p->score[0] = 100;
strcpy(p->name, "jerry");
}
可以看到,通过地址传递修改了结构体内的数据
用&stu做实参,&stu是结构体变量stu的地址。在调用函数时将该地址传送给形参p(p是指针变量)。这样p就指向stu。
在change函数中改变结构体内成员的值,在主函数中就输出了改变后的值。
Reference:
https://blog.csdn.net/xiangwanpeng/article/details/52454479
https://www.runoob.com/w3cnote/c-the-structure-of-the-parameter.html