Java 和 C/C++ 中的变量是内存位置还是该内存位置保存的值?

Are variables in Java and C/C++ the memory location or the value saved in that memory location?

我知道如何使用变量并处理它们。但是,由于那里给出了许多不同的定义,因此很难理解真正的变量是什么。真正让我困惑的是 java 的对象如何表现得像按引用传递,即使它是按值传递的。 所以通过引用传递是当被调用函数创建指向其参数的指针并且指针指向变量地址时,对吗? 但是在 java 中,对象的地址被传递给函数,这使得它的行为类似于通过引用传递。 这是否意味着变量和值不是一回事?从上面的解释来看,它们似乎有不同的内存地址。 当传递指向变量的指针时,它是通过引用传递的。但是当传递对象的内存地址时,它是按值传递的。

int obj = new SomeObject(); // do obj and SomeObject have the same memory address...confused

我知道按值传递和按引用传递之间的区别。我只想知道一个变量是否实际映射到内存位置或内存地址或存储在该内存中的值 location/address?

C 和 Java 按值传递所有内容,没有其他方法。这也是 C++ 的默认设置,但它有额外的符号用于将参数作为引用传递。

按值传递某物意味着创建了一个新变量,它在 method/function:

内部
// C/C++, Java
void something(int x){
  x=10;
  // printf/cout/System.out.println x here, and it will be 10
}

void usesSomething(){
  int y=5;
  // printf/cout/System.out.println y here, and it will be 5
  something(y);
  // printf/cout/System.out.println y here, and it will be 5, x was just a copy
}

和Java对象没有区别:

void something(String x){
  x=new String("something");
  System.out.println("In something: "+x);
}

void usesSomething(){
  String y=new String("Hello!");
  System.out.println(y); // "Hello!"
  something(y);
  System.out.println(y); // again "Hello!", x was just a copy
}

令人困惑的部分只是措辞,因为变量本身在 Java 中称为 "object references"(在 C/C++ 中它们将是 "pointers")。但是它们(对象引用)是按值传递的,在此代码中 y 没有任何变化。

通过引用传递某些东西意味着对引用做任何事情都会直接影响原始变量。

// C++ only
void something(int &x){
  x=10;
}

void usesSomething(){
  int y=5;
  std::cout << y << std::endl; // it is 5
  something(y);
  std::cout << y << std::endl; // it is 10, x was the same variable as y
}


值得一提的是,对象和变量在 Java 中从来不是一回事。对象驻留在堆上(比如故意夸大的"Hello!"和"something"),而这些对象的引用变量(x和y)可以驻留在任何地方(这里是驻留在栈上),并且它们有它们自己的内存用于存储对这些对象的引用(在 C/C++ 中它非常像一个指针,它也有一个大小,大约 4-8 个字节)。
所以在一般情况下,这就是对象如何 'feel' 通过引用传递:你实际上通过值传递对象引用,最终引用同一个对象。如果对象是可变的(字符串不是),则更改将从外部可见,通过引用同一对象的任何其他变量。但是引用变量本身是你自己的,如果你改变它(并引用一个不同的对象,也许是null),其他人不会注意到。