c语言中两个结构体变量相互赋值之后再改变其中一个变量的成员后不会影响另外一个变量的成员
例如:
typedef struct {
int num;
}test;
int main() {
test a;
a.num = 5;
test b = a;
b.num--;
printf("a:%d,b:%d", a.num, b.num);
}
输出结果为a:5,b:4
而Java中两个类变量相互赋值时是将a的地址赋值给b,所以改变其中一个值会影响另外一个变量的值,例如:
public class Classtest {
public static void main(String[] args) {
test a = new test();
a.num=5;
test b=a;
a.num--;
System.out.println("a:"+a.num+", b:"+ b.num);
}
}
class test{
int num;
}
输出结果为:a:4 , b:4
总结:c语言中不管是基本类型还是构造类型全都是值传递,想要通过b变量的修改来影响a变量的值必须用到指针来操作内存,而Java的基本数据类型是值传递,但其引用数据类型是引用传递,再内存中两个类变量的相互赋值实则时候将a的地址赋给b。
应用:再swap()函数的实现中,因为c语言是值传递,故而在函数内无法完成两个变量值的交换,但c语言可以利用指针来操作内存,从而实现在函数内进行交换变量值,但java是明确删除指针的计算机语言,想要在函数内进行值的交换,则可以使用引用数据类型
c语言swap函数:
void swap(int *a, int *b) {
int c = *a;
*a = *b;
*b = c;
}
int main() {
int a = 1;
int b = 2;
printf("a:%d,b:%d\n", a, b);
swap(&a, &b);
printf("a:%d,b:%d\n", a, b);
}
执行结果a:1,b:2
a:2,b:1
java语言的swap函数:
public class Classtest {
static void swap(test a,test b){
int c=a.num;
a.num=b.num;
b.num=c;
}
public static void main(String[] args) {
test a=new test(1);
test b=new test(2);
System.out.println("a:"+a.num+",b:"+b.num);
swap(a,b);
System.out.println("a:"+a.num+",b:"+b.num);
}
}
class test{
int num;
public test(int a){
this.num=a;
}
}
执行结果a:1,b:2
a:2,b:1