值存在哪里,值是什么
例子1
void swap(int a, int b) {
int temp = a;
a = b;
b = temp;
printf("in swap: a = %d,b = %d \n", a, b);
}
int main() {
int a = 10, b = 20;
printf("before swap in main: a = %d,b = %d \n", a, b);
swap(a, b);
printf("after swap in main: a = %d,b = %d \n", a, b);
return 0;
}
//output
//before swap in main: a = 10,b = 20
//in swap: a = 20,b = 10
//after swap in main: a = 10,b = 20
内存地址100存的10,104存的20,而swap栈帧中的10和20是main栈帧的一份拷贝值,字面量是10和20(内存地址已经更新为swap栈帧中的内存地址了,他们值虽然一样,但是已经不是同一份数据了)
例子2
void swap(int *a, int *b) {
int *temp = a;
*a = *b;
*b = *temp;
}
int main() {
int a = 10, b = 20;
printf("before swap in main: a = %d,b = %d \n", a, b);
printf("address a: %p,address b:%p\n", &a, &b);
swap(&a, &b);
printf("after swap in main: a = %d,b = %d \n", a, b);
return 0;
}
//output
//before swap in main: a = 10,b = 20
//address a: 0x7ffee049e8c8,address b:0x7ffee049e8c4
//after swap in main: a = 20,b = 20
传递的是内存地址,直接改的对应内存地址里边的数据,自然是可以同步影响到main函数所在栈帧的。
回到Java,虽然都是传值,但是有的值就是字面值,例如 1
2
"chenshun"
,但是有的值存的只是堆对象的一个引用,虽然他们是两个对象,但是引用的对象地址却是同一个,通过引用修改堆上的数据,自然就可以影响到mian函数了。