【问题标题】:C# array and pointersC# 数组和指针
【发布时间】:2011-05-18 18:00:40
【问题描述】:

关于将数组传递给函数,然后操作数组内容(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 分配之后调用该函数。

需要这方面的指导。 谢谢

【问题讨论】:

    标签: c# arrays pointers


    【解决方案1】:

    如果您希望 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]);
    

    【讨论】:

    • 感谢您的详细解答。选择你的正确,因为你是许多给出相同答案的人中的第一个。不过,干杯!
    【解决方案2】:
    byte[] arrayB = arrayA;
    

    不会导致复制 arrayA,仅复制其引用 - 您正在将 arrayB 传递给方法。

    【讨论】:

      【解决方案3】:

      Arrays in C# are reference types. arrayA 和 arrayB 都只是对堆上同一个数组实例的引用(某种指针,但不是真的)。如果要提供副本,则必须明确CopyTo() 数组内容。

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2023-03-11
        • 2015-03-27
        • 1970-01-01
        • 1970-01-01
        • 2018-09-26
        • 2023-03-17
        相关资源
        最近更新 更多