C#数组和指针

C#数组和指针,c#,arrays,pointers,C#,Arrays,Pointers,关于将数组传递给函数,然后操作数组内容(array.Reverse),然后使用指针,我从数组中提取值。但在开始函数之前,我要做的是: byte[] arrayA = OriginalArray byte[] arrayB = arrayA; manipulate(OriginalArray); 抽象出来的函数是这样的 manipulateArray(byte[] OriginalArray) // This is unsafe { // Unsafe code that keeps a

关于将数组传递给函数,然后操作数组内容(array.Reverse),然后使用指针,我从数组中提取值。但在开始函数之前,我要做的是:

byte[] arrayA = OriginalArray
byte[] arrayB = arrayA;

manipulate(OriginalArray);
抽象出来的函数是这样的

manipulateArray(byte[] OriginalArray) // This is unsafe
{
   // Unsafe code that keeps a pointer to OriginalArray
  // Array reverse 
  // Value extraction via pointer
}
这样做之后,令我惊讶的是,arrayB现在“已经”操纵了它的值,就好像我已经将它传递给了函数一样!除非我错过了什么,否则我很肯定我没有做错什么。我确保在arrayA和arrayB赋值之后调用该函数

我们需要这方面的指导。
谢谢

如果希望arrayB保留相同的值,则需要制作arrayA的副本。在您的示例中,arrayA和arrayB都指向相同的引用

下面是一个简单的例子来说明这一点:

byte[] originalArray = new byte[] { 1, 2, 3 };
byte[] arrayA = originalArray;
byte[] arrayB = arrayA;

//Both arrays point to the same reference, changes to arrayA
//or arrayB will affect both variables
arrayA[0] = 3;
arrayB[2] = 1;
//Both will output 3, 2, 1
Console.WriteLine("{0} {1} {2}", arrayA[0], arrayA[1], arrayA[2]);
Console.WriteLine("{0} {1} {2}", arrayB[0], arrayB[1], arrayB[2]);

//Copy array - both arrays point to different references
//Actions on arrayA will not affect arrayB
arrayB = new byte[arrayA.Length];
arrayA.CopyTo(arrayB, 0);
arrayA[0] = 1;
arrayA[2] = 3;
//First will output 1,2,3, second will output 3, 2, 1
Console.WriteLine("{0} {1} {2}", arrayA[0], arrayA[1], arrayA[2]);
Console.WriteLine("{0} {1} {2}", arrayB[0], arrayB[1], arrayB[2]);
不会导致复制arrayA,只复制其引用-您将arrayB传递给该方法。

arrayA和arrayB都只是对堆上相同数组实例的引用(某种指针,但实际上不是)。如果要提供副本,必须显式地
CopyTo()
数组内容

arrayA.CopyTo(arrayB, 0);
//or
Array.Copy(arrayA, arrayB, arrayB.Length);

谢谢你的详细回答。选择正确的答案,就像你是第一个给出相同答案的人一样。尽管如此,干杯!
arrayA.CopyTo(arrayB, 0);
//or
Array.Copy(arrayA, arrayB, arrayB.Length);