C # массив и указатели - PullRequest
2 голосов
/ 18 мая 2011

Что касается передачи массивов в функции, а затем манипулирования содержимым массива (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.

Нужны указания по этому вопросу.Спасибо

Ответы [ 3 ]

3 голосов
/ 18 мая 2011
byte[] arrayB = arrayA;

Не вызывает копирования массива A, только его ссылки - вы передаете arrayB методу.

3 голосов
/ 18 мая 2011

Массивы в C # являются ссылочными типами. И arrayA, и arrayB являются просто ссылками (сортировка указателей, но не совсем) на один и тот же экземпляр массива в куче.Если вы хотите предоставить копии, вам нужно явно CopyTo() содержимое массива.

arrayA.CopyTo(arrayB, 0);
//or
Array.Copy(arrayA, arrayB, arrayB.Length);
3 голосов
/ 18 мая 2011

Если вы хотите, чтобы 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]);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...