G***G 发帖数: 16778 | 1 int a = 1; //a有一个地址了。里面的内容是1
int b = a; //请问,b和a共用一个地址吗?还是b是另外一个地址,但是地址里的内
容是1
a = 2; //a的内容变成2了。请问a的地址改变了吗?此时b是等于1还是等于2?
showme(a);
public void showme(int c)
{
int d = c; //请问这个c和a是共用同一个地址吗?还是不同地址? d和c共用一
个地址吗?
}
-----------------下面更复杂一些
int a = new int();
a=1; //这个时候a的地址是改变了吗?
static int b = new int()
b = 1; //这个时候b的地址是没有改变,对吗? |
a*****e 发帖数: 1700 | 2 你应该把声明和赋值分开,才好理解。比如:
int a;
int b;
以上声明,a 和 b 各有一个 stack 上的地址。
a = 1;
b = a;
赋值的时候,要把 lvalue 和 rvalue 区分开,才好理解。比如上面两句可以改写为以
下形式:
write(&a, 1);
write(&b, a);
&a 表示取了变量 a 的地址,a 表示变量 a 所存储的值。write(X, Y) 表示向地址 X
写入值 Y。
【在 G***G 的大作中提到】 : int a = 1; //a有一个地址了。里面的内容是1 : int b = a; //请问,b和a共用一个地址吗?还是b是另外一个地址,但是地址里的内 : 容是1 : a = 2; //a的内容变成2了。请问a的地址改变了吗?此时b是等于1还是等于2? : showme(a); : public void showme(int c) : { : int d = c; //请问这个c和a是共用同一个地址吗?还是不同地址? d和c共用一 : 个地址吗? : }
|
n*****j 发帖数: 18 | 3 大牛一般都讨论高大上的东西和big picture,你这问题too simple sometimes naive,
怪不得没人鸟你 |
G***G 发帖数: 16778 | 4 我以前也是这样理解的。
但是
static int a;
a=1;
int b;
b = 1;
虽然a和b都是value type;虽然它们都赋值1;但是一个是静态地址,一个动态地址。
对于它们
a=1
和b=1
有很大的不同。
【在 a*****e 的大作中提到】 : 你应该把声明和赋值分开,才好理解。比如: : int a; : int b; : 以上声明,a 和 b 各有一个 stack 上的地址。 : a = 1; : b = a; : 赋值的时候,要把 lvalue 和 rvalue 区分开,才好理解。比如上面两句可以改写为以 : 下形式: : write(&a, 1); : write(&b, a);
|
a*****e 发帖数: 1700 | 5 你这是 java 还是 C 还是 C++?
没什么不同,不管是不是 static,都是内存里面的地址,有堆和栈的区别,也有 per
object 和 per class 的区别,但不影响你理解赋值的 lvalue 和 rvalue。
static 与否,唯一影响的是 scoping。就是说用到一个变量的时候,是指的哪个地方
声明的这个变量。
理解编程语言,理解它的语义是一方面,理解它的实现是另一方面。两者可以相互促进
理解,但是能区分开最好。
【在 G***G 的大作中提到】 : 我以前也是这样理解的。 : 但是 : static int a; : a=1; : int b; : b = 1; : 虽然a和b都是value type;虽然它们都赋值1;但是一个是静态地址,一个动态地址。 : 对于它们 : a=1 : 和b=1
|
z****e 发帖数: 54598 | 6 java里面a=1存的不是地址
就是primitive type
就是1
b=a的话,是value copy
存的是1
因为存的不是reference
都是value,所以不存在地址的问题 |
z****e 发帖数: 54598 | 7 static是在方法区内
java的static单独一个区
这个区跟stack&heap有交集
你可以认为是static的stack和static的heap
另外,again,不是地址
是primitive type,就是1
你反复说的地址是错误的
地址是Integer i=new Integer(1)
这时候i存的是地址,比如0x28ff21之类的
reference和value要区分
很多语言都有这个概念,比如swift
如果这个搞混了,你就麻烦了 |
f*******n 发帖数: 12623 | 8 每个变量有地址。无论primitive type还是reference type,两个变量a和b有不同的地
址。无论什么type,b=a都同样把a存的copy到b。
【在 z****e 的大作中提到】 : java里面a=1存的不是地址 : 就是primitive type : 就是1 : b=a的话,是value copy : 存的是1 : 因为存的不是reference : 都是value,所以不存在地址的问题
|
z****e 发帖数: 54598 | 9 java里面不这么说
你这样的话,要讨论stack的地址
那就烦了
【在 f*******n 的大作中提到】 : 每个变量有地址。无论primitive type还是reference type,两个变量a和b有不同的地 : 址。无论什么type,b=a都同样把a存的copy到b。
|
S*A 发帖数: 7142 | 10 C 里面变量不一定有地址,变量可以优化掉直接放到寄存器里面。 |
h**********c 发帖数: 4120 | 11 这个说变量和常量比较好解释吧,常量一般要加final,c里面是什么忘了。常量不加
final什么的,是很严重的security hole,一般讲c的书都这么讲。二般的公司,差不
多就行了。
von neuman architecture,程序空间和变量空间分离。这样program才reloadbale,
才有code reuse, 面向对象etc.
int a=8
8 is hard-coded value in program space.
如有错误望赐教
【在 G***G 的大作中提到】 : int a = 1; //a有一个地址了。里面的内容是1 : int b = a; //请问,b和a共用一个地址吗?还是b是另外一个地址,但是地址里的内 : 容是1 : a = 2; //a的内容变成2了。请问a的地址改变了吗?此时b是等于1还是等于2? : showme(a); : public void showme(int c) : { : int d = c; //请问这个c和a是共用同一个地址吗?还是不同地址? d和c共用一 : 个地址吗? : }
|
h**********c 发帖数: 4120 | 12 回到您的问题上,汇编,讲cpu的书有图例我记得,怎么load变量常量和hard code
value |
f*******n 发帖数: 12623 | 13 反正我的意思是java和C在这个讨论上没有区别。
【在 z****e 的大作中提到】 : java里面不这么说 : 你这样的话,要讨论stack的地址 : 那就烦了
|