黑马程序员技术交流社区

标题: 这块有点迷糊 [打印本页]

作者: ↖落葉下♀媃媚    时间: 2013-5-2 17:49
标题: 这块有点迷糊
本帖最后由 ↖落葉下♀媃媚 于 2013-5-3 10:46 编辑

     哪位大神详解一下?   
     int i1 = 20;
     int i2 = i1;
     i1++;
     Console.WriteLine(i2);//输出20
     Person p1 = new Person();
     p1.Age = 20;
     Person p2 = p1;
     p1.Age++;
     Console.WriteLine(p2.Age);//输出21
     Console.ReadKey();
作者: 王杨武    时间: 2013-5-2 18:11
你这个是值类型和引用类型的问题.值类型的赋值是复制的数据.引用类型的赋值是指针的指向.
谢谢.Alian为您解答.
作者: 曾大鹏    时间: 2013-5-2 19:08
int i2=i1;//这里的话 在堆内会开辟一个新的空间给i2 然后把i1的值赋值给i2 i2和i1开辟的空间不同 所以在i1++的时候,i2的值不会变 所以还是20


Person p2=p1;//这里的话,在堆内会开辟一个新的空间给p2,然后让p2指向p1所指向的空间,如果p1.age++的话 ,那么p1所指向的空间里的数据会+1,而p2跟p1是同一个指向 所以p2.age=21




作者: 陈晖    时间: 2013-5-2 19:19
int i2=i1;
是将i1的值复制一份给i2,之后i1与i2就没有任何关系了,后面i1++;操作就不会影响i2的值了。
Person p2=p1;
是将p1.Age的指向地址复制了一份给p2,
现在p1与p2的Age指向同一块地址,所以当修改p1.Age的时候,p2.Age的值也会发生变化。
:)
作者: mosuge7    时间: 2013-5-2 19:34
    int i1 = 20;
      int i2 = i1;//这里把i1赋值给i2=20,好比是房间1里放的是i1,值为20,房间B里放的是i2,值为20。AB是不同的地址,互补干扰的。
      i1++;//变的是i1,i1=21,但是i2并没有变化,因为房间B里放的还是20.
      Console.WriteLine(i2);//在房间B里,i2还是20.
      Person p1 = new Person();
      p1.Age = 20;
      Person p2 = p1;//这里和上面不同,这里P1代表的是一块地址,这里P1的地址和P2的地址相同,你可以理解为是同一个房间。
      p1.Age++;地址所在的值加1
      Console.WriteLine(p2.Age);//输出为21。
      Console.ReadKey();
      

作者: 张伟86    时间: 2013-5-2 22:01
本帖最后由 张伟86 于 2013-5-2 22:05 编辑

前面的大家说的很全面,我来补充点关于class的
C#中,

Person p1 = new Person() ;

上面的代码将会在堆中生成一个对象,并且让引用p1指向这个对象,而引用p1本身位于栈中,占用四个字节(在32位处理器上,即一个指针的长度)。


Person p2 ;

该声明将会在栈中生成一个长度位4字节的引用变量s2并且缺省为null,即该引用不指向任何实例。

p2 = p1 ;

该赋值语句并没有调用赋值运算符,而是仅仅使s2指向s1所指向的对象。所以上述语句执行完后,内存布局大致如下图






欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2