积极答复者
数组问题?

问题
-
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大其心,可容天下之物; 虚其心,可受天下之善;
答案
-
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); } } }
- 已建议为答案 Lisa ZhuModerator 2012年8月16日 1:39
- 已标记为答案 Lisa ZhuModerator 2012年8月22日 1:54
全部回复
-
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); } } }
- 已建议为答案 Lisa ZhuModerator 2012年8月16日 1:39
- 已标记为答案 Lisa ZhuModerator 2012年8月22日 1:54
-
一、我有点晕,哥们;数组是引用类型;在
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)
大其心,可容天下之物; 虚其心,可受天下之善;
-
>>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?