变量与数组的浅复制

       变量声明以后是放在堆叠区,new以后,或者赋值以后把new出的新对象或者变量的值放在堆积区,也就是说堆叠区存放的是新对象或者值的地址,堆积区存放的才是真正的新对象或者值,我们要访问新对象或者新赋的值的方式是根据堆叠区的存放位置找到相对应的堆积区的准确位置。

       当我们声明一个字符串类型的变量c1,给c1赋值为c1=“abc”,指的是我们在堆叠区声明了一块空间这个空间里存了一个地址比如存的地址是“堆积区201号房”,赋值后指的是在堆积区201号房里放了一个东西是“abc”,再声明一个字符串类型的变量c2,同样c2也是在堆叠区声明了一块空间里面存了一个地址是“堆积区202号房”,因为未赋值所以现在堆积区202房间没有任何东西。如果我们让c2=c1,指的是把c1存放的地址给了c2,也就是说原本c2存放的“堆积区202号房”这个地址换成了c1中存储的“堆积区201号房”这个地址,现在他们两个存放的地址的都是“堆积区201号房间”,c1=c2传的是引用或者说传的是地址。但是如果我们让c2=c1.clone(),这时指的是将c1指向的堆积区201号房里面存放的东西复制一份,存放到c2指向的堆积区202号房。201号房和202号房里面的东西就是独立的两个东西,只不过这两个东西长得是一样的而已。

        数组道理相似。我们声明了一个字符串类型的数组c1(2),表明该数组有3个元素即a(0),a(1),a(2),现在我们分别给各元素赋值 a(0)=”A”,  a(1)=”B”,  a(2)=”C”,然后我们再声明一个字符串类型的数组c2(),我们让c2=c1,这样传递的同样是地址。但是如果我们让c2=c1.clone(),我们会发现运行结果表明c1与c2之间传递的同样还是引用。这是因为数组具有层级关系。当我们声明数组c1时,其存放的地址就不是一个了,而是多个。c1中各元素如c1(0),c1(1),c1(2)相当于堆叠区c1中的坛子,柜子,橱子,这坛子,柜子,橱子里分别存放的才是真正的值A,B,C的地址。当我们写c2=c1的时候,表示c2存放的地址由“堆积区202号房”变成了另一个地址:“去c1里面找”。当我们让c2=c1.clone()时,其实表示的是把c1中的坛子,柜子,橱子(包括他们中存放的A,B,C的真正地址),复制了一份放到了c2中,而真正的A,B,C的地址始终是没有发生变化的,所以c2=c1.clone()的本质实际上传递的其实还是地址。

你可能感兴趣的:(c,存储)