A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© ↖落葉下♀媃媚 中级黑马   /  2013-5-2 17:49  /  1357 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 ↖落葉下♀媃媚 于 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();

评分

参与人数 1技术分 +1 收起 理由
苏波 + 1

查看全部评分

5 个回复

倒序浏览
你这个是值类型和引用类型的问题.值类型的赋值是复制的数据.引用类型的赋值是指针的指向.
谢谢.Alian为您解答.
回复 使用道具 举报
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



评分

参与人数 1技术分 +1 收起 理由
苏波 + 1

查看全部评分

回复 使用道具 举报
int i2=i1;
是将i1的值复制一份给i2,之后i1与i2就没有任何关系了,后面i1++;操作就不会影响i2的值了。
Person p2=p1;
是将p1.Age的指向地址复制了一份给p2,
现在p1与p2的Age指向同一块地址,所以当修改p1.Age的时候,p2.Age的值也会发生变化。
:)

评分

参与人数 1技术分 +1 收起 理由
苏波 + 1

查看全部评分

回复 使用道具 举报
    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();
      

评分

参与人数 1技术分 +1 收起 理由
苏波 + 1

查看全部评分

回复 使用道具 举报
本帖最后由 张伟86 于 2013-5-2 22:05 编辑

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

Person p1 = new Person() ;

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


Person p2 ;

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

p2 = p1 ;

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

评分

参与人数 1技术分 +1 收起 理由
苏波 + 1

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马