值存在哪里,值是什么

例子1

  1. void swap(int a, int b) {
  2. int temp = a;
  3. a = b;
  4. b = temp;
  5. printf("in swap: a = %d,b = %d \n", a, b);
  6. }
  7. int main() {
  8. int a = 10, b = 20;
  9. printf("before swap in main: a = %d,b = %d \n", a, b);
  10. swap(a, b);
  11. printf("after swap in main: a = %d,b = %d \n", a, b);
  12. return 0;
  13. }
  14. //output
  15. //before swap in main: a = 10,b = 20
  16. //in swap: a = 20,b = 10
  17. //after swap in main: a = 10,b = 20

image.png
内存地址100存的10,104存的20,而swap栈帧中的10和20是main栈帧的一份拷贝值,字面量是10和20(内存地址已经更新为swap栈帧中的内存地址了,他们值虽然一样,但是已经不是同一份数据了)

例子2

  1. void swap(int *a, int *b) {
  2. int *temp = a;
  3. *a = *b;
  4. *b = *temp;
  5. }
  6. int main() {
  7. int a = 10, b = 20;
  8. printf("before swap in main: a = %d,b = %d \n", a, b);
  9. printf("address a: %p,address b:%p\n", &a, &b);
  10. swap(&a, &b);
  11. printf("after swap in main: a = %d,b = %d \n", a, b);
  12. return 0;
  13. }
  14. //output
  15. //before swap in main: a = 10,b = 20
  16. //address a: 0x7ffee049e8c8,address b:0x7ffee049e8c4
  17. //after swap in main: a = 20,b = 20

image.png
传递的是内存地址,直接改的对应内存地址里边的数据,自然是可以同步影响到main函数所在栈帧的。

回到Java,虽然都是传值,但是有的值就是字面值,例如 1 2 "chenshun",但是有的值存的只是堆对象的一个引用,虽然他们是两个对象,但是引用的对象地址却是同一个,通过引用修改堆上的数据,自然就可以影响到mian函数了。