黑马程序员技术交流社区

标题: 值类型引用类型实例的一个问题 [打印本页]

作者: 专属第三    时间: 2014-6-23 16:47
标题: 值类型引用类型实例的一个问题
本帖最后由 专属第三 于 2014-6-24 22:12 编辑


这里边的第二个图,是用out或者ref传参的时候显示图,此时产生的这个n还是值类型吗?产生了一个地址存储数据和一个指向地址,那么这里的地址在堆中还是在栈中.
如果上述的猜想正确,那么是不是说值类型和引用类型其实都是在内存中开辟了地址和指向地址,不同的是引用类型赋值的时候只传了地址,值类型是将两个一起赋值给别人的
说的语句不是很专业词汇,如果有表达不清楚的请探讨

作者: 许庭洲    时间: 2014-6-23 20:11
1. 将一个值类型变量赋值给另一个值类型变量时,将复制包含的值;
2. 引用类型变量的赋值只复制对对象的引用,而不复制对象本身。
作者: 天佑の清清    时间: 2014-6-24 09:19
对于值类型来说,当其作为函数参数的时候,希望在函数中被修改,那么直接如下操作是不能被修改的:  
public void Increment( int i )  
{   
      i++;  
}   
要想在函数中对传进去的参数做真正的修改,需要借助于ref这个关键字,那么正确的形式如下:
public void Increment( ref int i )   
{     
      i++;   
  }            
也就是说,如果需要在函数中对值类型参数进行修改,需要用ref或者out进行标识才可以
作者: 黑马-柯校    时间: 2014-6-24 09:58
首先你这个标题就写错了,应该是值传递和引用传递
平时 我们不用ref和out 属于值传递,那什么是值传递那,就是变量里面的值,这里有很多人会搞错,
值传递
变量里面的值,如果变量存储的是值类型,那么传递的是变量里面存储的具体的值,
如果这个变量存储的是引用类型对象,那么传递的是该对象在对空间中的引用地址
引用传递:
如果你理解了上面我说的,那么下面就简单了
引用传递其实传递的是 变量本身在栈空间中的地址,这里的地址是变量本身的地址

作者: 黑马-柯校    时间: 2014-6-24 10:03
这个n 是值类型,开辟在栈空间中,看我上面说明
作者: 专属第三    时间: 2014-6-24 20:22
天佑の清清 发表于 2014-6-24 09:19
对于值类型来说,当其作为函数参数的时候,希望在函数中被修改,那么直接如下操作是不能被修改的:  
publi ...

也就是说在这里因为是ref/out,所以传递的虽然是值类型,但是原值还会被修改.这个回答是肯定了n的类型,但是没有分析此时n作为值类型的传参问题
作者: 专属第三    时间: 2014-6-24 21:13
本帖最后由 专属第三 于 2014-6-24 22:12 编辑
黑马-柯校 发表于 2014-6-24 09:58
首先你这个标题就写错了,应该是值传递和引用传递
平时 我们不用ref和out 属于值传递,那什么是值传递那, ...


这里其实是我搞混了值类型(引用类型) 与值传递(引用传递)


作者: 黑马-柯校    时间: 2014-6-25 22:34
专属第三 发表于 2014-6-24 20:22
也就是说在这里因为是ref/out,所以传递的虽然是值类型,但是原值还会被修改.这个回答是肯定了n的类型,但是 ...

童鞋 我上面写的 你没理解吗?
n是值类型,但是用ref修饰了,是属于引用传递,传递的是变量本身的地址。

变量本身的地址和变量值的地址,不同的概念




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