none
数组问题? RRS feed

  • 问题


  • class ArrayClass
    {
        static void PrintArray(string[] arr)
        {
            for (int i = 0; i < arr.Length; i++)
            {
                System.Console.Write(arr[i] + "{0}", i < arr.Length - 1 ? " " : "");
            }
            System.Console.WriteLine();
        }

        static void ChangeArray(string[] arr)
        {
                    arr = (arr.Reverse()).ToArray();
                  System.Console.WriteLine("arr[0] is {0} in ChangeArray.", arr[0]);
        }

     

        static void Main()
        {
                    string[] weekDays = { "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat" };

                   PrintArray(weekDays);

                   ChangeArray(weekDays);

               System.Console.WriteLine("Array weekDays after the call to ChangeArray:");
            PrintArray(weekDays);           }
    }
    // Output:
    // Sun Mon Tue Wed Thu Fri Sat
    // arr[0] is Sat in ChangeArray.
    // Sun Mon Tue Wed Thu Fri Sat

    为什么输出来的不是:

    // Sun Mon Tue Wed Thu Fri Sat
    // arr[0] is Sat in ChangeArray.
    //  Sat Fri  Thu  Wed  Tue   Mon Sun


    大其心,可容天下之物; 虚其心,可受天下之善;

    2012年8月15日 11:09

答案

  • arr.Reverse()是一个深拷贝——这个意味着原先传入的数组经过改变之后不影响原来的那个数组。

    画图便可以证明:

    正解:

    namespace CSharp
    {
    
        using System;
        using System.IO;
    
        class ArrayClass
        {
            static void PrintArray(string[] arr)
            {
                for (int i = 0; i < arr.Length; i++)
                {
                    System.Console.Write(arr[i] + "{0}", i < arr.Length - 1 ? " " : "");
                }
                System.Console.WriteLine();
            }
    
            static void ChangeArray(string[] arr)
            {
                Array.Reverse(arr);
                System.Console.WriteLine("arr[0] is {0} in ChangeArray.", arr[0]);
            }
    
    
    
            static void Main()
            {
                string[] weekDays = { "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat" };
    
                PrintArray(weekDays);
    
                ChangeArray(weekDays);
    
                System.Console.WriteLine("Array weekDays after the call to ChangeArray:");
                PrintArray(weekDays);
            }
        }
    
    }

    下载MSDN桌面工具(Vista,Win7)
    我的博客园
    慈善点击,点击此处

    2012年8月16日 1:24
    版主

全部回复

  • arr.Reverse()是一个深拷贝——这个意味着原先传入的数组经过改变之后不影响原来的那个数组。

    画图便可以证明:

    正解:

    namespace CSharp
    {
    
        using System;
        using System.IO;
    
        class ArrayClass
        {
            static void PrintArray(string[] arr)
            {
                for (int i = 0; i < arr.Length; i++)
                {
                    System.Console.Write(arr[i] + "{0}", i < arr.Length - 1 ? " " : "");
                }
                System.Console.WriteLine();
            }
    
            static void ChangeArray(string[] arr)
            {
                Array.Reverse(arr);
                System.Console.WriteLine("arr[0] is {0} in ChangeArray.", arr[0]);
            }
    
    
    
            static void Main()
            {
                string[] weekDays = { "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat" };
    
                PrintArray(weekDays);
    
                ChangeArray(weekDays);
    
                System.Console.WriteLine("Array weekDays after the call to ChangeArray:");
                PrintArray(weekDays);
            }
        }
    
    }

    下载MSDN桌面工具(Vista,Win7)
    我的博客园
    慈善点击,点击此处

    2012年8月16日 1:24
    版主
  • 一、我有点晕,哥们;数组是引用类型;在

    arr = (arr.Reverse()).ToArray();赋值之后,arr应该改变了啊;我还是不明白;

    二、传参数时可以用修饰符out 或ref; msdn的例子是用数组来当参数,数组是引用类型;用不用out或ref,对数组没有影响啊;为什么用out或ref来讲解out或ref的作用呢?http://msdn.microsoft.com/zh-cn/library/szasx730(v=vs.100)


    大其心,可容天下之物; 虚其心,可受天下之善;

    2012年8月16日 7:08
  • >>arr = (arr.Reverse()).ToArray();赋值之后,arr应该改变了啊;我还是不明白;

    不改变的。因为ToArray将把排序的数组拷贝一份,因此arr指向的是数组的副本。请查看我的图。而且又因为arr只在函数范围内有效,因此一旦离开函数自动消亡了。(关键——arr指向的对象发生改变!)

    此题目还非得要ref方法。你可以理解为ref指向的是数组的地址(绝对地址)。即便对arr发生了改变(例如你题目中重新生成新数组)。此时它会自动把栈上指向数组的指针指向那个拷贝的数组副本。因此发生了变化。

    而你一开始的只是在函数体中又生成了一个新的指针,结果指向了不同的对象。因此不会发生改变。

    你再思考:

    object obj = new object();
    
    //假设一个函数
    void Fun(object o)
    {
       o = null;
    }
    
    //调用
    Fun(obj);
    
    //你认为obj=null?

    下载MSDN桌面工具(Vista,Win7)
    我的博客园
    慈善点击,点击此处

    2012年8月16日 7:17
    版主