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]

解决方案 »

  1.   

    首先 Swap 函数的写法是错误的,这样写无法实现交换的,必须写成
            static void Swap(ref int[] i, ref int[] j)
            {
                int[] intTemp = i;
                i = j;
                j = intTemp;
            }
    也就是用引用方式传递参数
    第个组代码之所以可以改变数组中元素的值是因为改变的是参数指向的内存,而不是
    参数本身,如果写成 arrInt = new int[2] ; 一样是无法改变该参赛
      

  2.   

    还是不太了解,对于按值传参的方式(即不用ref修饰符来修饰的情况下)传递数组时,传进来的并不是地址,而是它的一份挎贝,所以无论是方法static void SetValue(int[] arrInt)还是static void Swap(int[] i,int[] j),在方法内部处理的,实际上都只是此数组的挎贝而已,但为什么SetValue方法里,改变数组内部的元素值会影响实参的值,而Swap方法中,不改变数组内部元素值,而只是改变数组本身,却不会影响到实参的值?
      

  3.   

    或者说,以下两个方法的效果是否一样?原理呢?
    static void SetValue(int[] arrInt)
    {
       arrInt[0] = -1;
    }static void SetValue(ref int[] arrInt)
    {
        arrInt[0] = -1;
    }
      

  4.   

    http://www.cnblogs.com/cyq1162/archive/2007/08/16/858023.html
      

  5.   

    看了楼上的,还是不太理解static void SetValue(int[] arrInt)和static void SetValue(ref int[] arrInt)的区别。