关于按值传参和按引用传参,大家分析一个这两段代码的内存分配过程。

newmoon2004 2007-08-15 05:37:10
class Class1
{

static void Main(string[] args)
{
int[] i = new int[3]{1,2,3};
int[] j = new int[4]{-1,-2,-3,0};

Swap(i,j);

//输出i的第一个元素=1,j的第一个元素=-1
Console.WriteLine("i的第一个元素={0},j的第一个元素={1}",i[0],j[0]);
Console.ReadLine();
}

//交换值
static void Swap(int[] i,int[] j)
{
int[] intTemp = i;
i = j;
j = intTemp;
}
}
似乎,如果是从按值传参的角度来分析,因为方法内部的修改不会改变实参的值,这样的解释对此结果是正确的。

但以下代码:
class Class1
{
static void Main(string[] args)
{
int[] arrInt = new int[3];

SetValue(arrInt);

//输出i的第一个元素=-1
Console.WriteLine("arrInt的第一个元素={0}",arrInt[0]);
Console.ReadLine();
}

static void SetValue(int[] arrInt)
{
for (int i = 0; i < arrInt.Length; i++ )
{
arrInt[i] = -1;
}
}
}
在这段代码中,同样还是数组(引用类型的变量),同样是按值传参(没有用ref关键字修饰),又该如何解释?
望有人分析一下两段代码的内存分配。
...全文
462 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
newmoon2004 2007-08-17
  • 打赏
  • 举报
回复
看了楼上的,还是不太理解static void SetValue(int[] arrInt)和static void SetValue(ref int[] arrInt)的区别。

  • 打赏
  • 举报
回复
http://www.cnblogs.com/cyq1162/archive/2007/08/16/858023.html
newmoon2004 2007-08-16
  • 打赏
  • 举报
回复
或者说,以下两个方法的效果是否一样?原理呢?
static void SetValue(int[] arrInt)
{
arrInt[0] = -1;
}

static void SetValue(ref int[] arrInt)
{
arrInt[0] = -1;
}
newmoon2004 2007-08-16
  • 打赏
  • 举报
回复
还是不太了解,对于按值传参的方式(即不用ref修饰符来修饰的情况下)传递数组时,传进来的并不是地址,而是它的一份挎贝,所以无论是方法static void SetValue(int[] arrInt)还是static void Swap(int[] i,int[] j),在方法内部处理的,实际上都只是此数组的挎贝而已,但为什么SetValue方法里,改变数组内部的元素值会影响实参的值,而Swap方法中,不改变数组内部元素值,而只是改变数组本身,却不会影响到实参的值?
eaglet 2007-08-15
  • 打赏
  • 举报
回复
首先 Swap 函数的写法是错误的,这样写无法实现交换的,必须写成
static void Swap(ref int[] i, ref int[] j)
{
int[] intTemp = i;
i = j;
j = intTemp;
}
也就是用引用方式传递参数
第个组代码之所以可以改变数组中元素的值是因为改变的是参数指向的内存,而不是
参数本身,如果写成 arrInt = new int[2] ; 一样是无法改变该参赛


idayu 2007-08-15
  • 打赏
  • 举报
回复
static void SetValue(int[] arrInt)
{
for (int i = 0; i < arrInt.Length; i++ )
{
arrInt[i] = -1;
}
}
这一过程虽然也是值传递,传进来的是数组的地址,
所以参数arrInt实际保存的是数组地址的一个副本
然后在赋值的时候arrInt[i] = -1;实际是对数组的元素进行了赋值,
虽然过程执行完毕后,参数arrInt(实际保存的是数组地址的一个副本)被回收,
但是数组的元素已被修改。

然而:
static void Swap(int[] i,int[] j)
{
int[] intTemp = i;
i = j;
j = intTemp;
}
参数i,j保存的数组地址的副本,然后互换赋值,过程执行完毕,内存被回收,
并没有改变数组元素的值。除非改数组元素的值如 i[0]=j[0]
foyuan 2007-08-15
  • 打赏
  • 举报
回复
这么多代码

经常会晕的 你写简单点

110,571

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧