问关于java数组引用的一个问题 给了不少分 希望越具体越好

2024-12-30 22:09:11
推荐回答(5个)
回答1:

main中的A的change中的x不是同一个变量,这要区分堆栈的概念,A,X,Z都是引用,其中存的是变量的引用值(可理解为地址),当调用change时,A的引用值传递给X,也就是说,A和X是不同的变量,但引用了相同的数据地址,当X[0]改变时,A[0]也变(地址相同);当Z赋值组X的时候,不是Z里的数据给X,而是Z的地址值给了X,也就是说,Z和X指向相同的新地址,此时A仍然指向原来地址,所以A没变,但A[0]被重新赋值了。

回答2:

结果为1、-2.0、-3.0、3.0,是正确的!
为1,值类型,本身修改,并未做改变。
数组为引用类型,也就是说,引用同一个堆的值。所以前2个都进行了改变,只要改变了,输出时也会相应的改变。这个应该清楚。
最后一个为什么没有改变呢?也是最关键的地方,x和y互相赋值改变了,但是x和z却没有用,是因为x先把它本身所存的的对象指针赋值给y,然后y在进行了赋值,于是就更改了存在堆的值,然后在输出的时候,就会把更改的值进行了输出。
但是x和z是z先将值赋给了z,而z是一个引用类型,它本身在堆里面已经存在一个空间了,然后将z赋给x,实际仅仅是z的下标指针赋给了x,然后输出的时候,取得并不是z的值,而实际取得还是x的值。

介个,本人描述不够清楚,如果有兴趣,可以查看林兴写的一篇文章。仅供参考。
http://msdn.microsoft.com/zh-cn/downloads/dd365372.aspx

回答3:

x是形参,指向了带入参数的A的地址,所以修改x里面内容的时候会直接修改A里面的内容
但是如果将x=z,相当于把x指向了z的地址,与原来的A不产生任何关系,下面距离
A指向地址2000 地址2000
将A带入x后,x指向A地址2000,x可以直接修改内存地址2000里面的具体内容
z地址是2010
x=z后,x只想地址变更为2010,这个时候如果在修改x,那么就会修改z地址上面的东西,与原来的A无任何关系
A指向的地址还是2000
x和z指向的地址都变成了2010

回答4:

应把x、y、z以及A这几个变量都理解为指针。

首先,k的数值没有被修改,原因是i是k的拷贝,change函数修改了局部变量i的值,这不会影响到原来k的值。

事实上,change函数中,x得到的也是A变量的一个拷贝,他们是两个变量,但是存储同样的地址,如果在change函数中修改x的值,也不会影响到原来的A(就像代码中把z赋给x那样)。

问题在于,你x[0]=-2.0也好,y[1]=-3.0也好,都是通过x、y这两个指针做间接访问,而x、y以及A都存的是同样的地址,这么做自然影响到原数组A中存储的数值。

回答5:

change(int i,double x[]){},这个方法里面
x[0]=-2.0;第一句是把x的第一个元素变为-2.0
double y[]=x;让y和x指向同一块内存,y=x=某内存,这时候你修改任意一个数组,另一个数组也会变化(这里是地址传递)
double z[]={-4,-4,-4};这句代码的意思是给数组z初始化,开辟一个新的内存
x=z;把z的参数赋给x了,就与原始x没关系了,这个x就成了z的一个副本,(这里是参数传递)
但是你在main(){}调用的是原始地址的A,而不是z的副本,所以打印结果是1,-2.0,-3.0,3.0
希望你能理解,