#c# #arrays #pointers
#c# #массивы #указатели
Вопрос:
Что касается передачи массивов функциям и последующего манипулирования содержимым массива (Array.Наоборот), а затем с помощью указателей я извлекаю значения из массива. Но прежде чем перейти к функции, вот что я делаю;
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.
Нужны рекомендации по этому поводу. Спасибо
Ответ №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]);
Комментарии:
1. Спасибо за подробный ответ. Выбрал ваш настолько правильно, поскольку вы были первым из многих, кто дал такой же ответ. Тем не менее, приветствую!
Ответ №2:
byte[] arrayB = arrayA;
Не вызывает копирование arrayA, только его ссылки — вы передаете arrayB методу.
Ответ №3:
Массивы в C # являются ссылочными типами. И arrayA, и arrayB — это просто ссылки (своего рода указатели, но не совсем) на один и тот же экземпляр массива в куче. Если вы хотите предоставить копии, вы должны явно CopyTo()
указать содержимое массива.
arrayA.CopyTo(arrayB, 0);
//or
Array.Copy(arrayA, arrayB, arrayB.Length);