C# 数组和指针

本文关键字:指针 数组 | 更新日期: 2023-09-27 17:56:44

关于将数组传递给函数,然后操作数组内容(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 现在"拥有"了它的值,就好像我把它传递给函数一样!除非我错过了什么,否则我很确定我没有做错什么。我确保在数组 A 和数组 B 赋值之后调用该函数。

需要这方面的指导。谢谢

C# 数组和指针

如果希望 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]);
byte[] arrayB = arrayA;

不会导致复制数组 A,只导致其引用的复制 - 您正在将数组 B 传递给该方法。

C# 中的数组是引用类型。arrayA 和 arrayB 都只是对堆上同一数组实例的引用(指针排序,但不是真正的)。如果要提供副本,则必须显式CopyTo()数组内容。

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