Массивы. Часть 3. Ссылки на массивы. Свойство Length. Присваивание массивов

Массивы. Часть 3. Ссылки на массивы. Свойство Length. Присваивание массивов


Содержание


1. Каким образом реализуется присваивание ссылок на массив? Как компилятор C# реализует присваивание переменных типа «массив»? Пример

Для любого новосозданного массива память выделяется с помощью оператора new. Это означает, что массивы есть ссылочного типа (а не типа значения). То есть, переменные типа «массив» есть ссылками на эти массивы.
После присваивания значения одной переменной (ссылки на массив) другой переменной, обе переменные будут указывать (ссылаться) на один и тот же массив. То есть, копия массива не создается.

Чтобы переменные указывали на разные участки памяти (разные массивы данных) – для любой из них нужно выделять память оператором new. Если нужно выполнить копирование данных одного массива в другой, то это нужно выполнить программным путем, например с помощью операторов цикла.

 

2. Пример присваивания переменным ссылок на массив

Пример. В примере объявляется массив из 20 вещественных чисел и демонстрируется операция присваивания ссылок на этот массив.

// копирование ссылок на массивы
double[] M1 = new double[20]; // объявление массива M1 из 20 вещественных чисел
double[] M2; // для массива M2 память не выделена

// заполнение массива M1 произвольными значениями
for (int i = 0; i < 20; i++)
    M1[i] = 0.1 * i;

M2 = M1; // теперь M2 и M1 ссылаются на один и тот же участок памяти

double d;
d = M2[3]; // d = 0.3

 

3. Как определить количество элементов в массиве? Свойство Length

Длина (количество элементов) массива может сохраняться в программе в специальных, дополнительных переменных. Поскольку, в языке C# массив есть объектом, то его длина сохраняется в свойстве Length.

// демонстрация использования свойства Length
char[] C = new char[20];
float[] F = new float[100];
int[] I = new int[500];
int d;
d = C.Length; // d = 20
d = F.Length; // d = 100
d = I.Length; // d = 500


 

4. Какие особенности применения свойства Length для многомерных массивов?

В случае многомерных массивов, свойство Length возвращает количество элементов всего массива.

// свойство Length для многомерных массивов
uint[,] UI = new uint[200,10]; // двумерный массив
bool[][] B = new bool[3][]; // ступенчатый массив
float[, ,] F = new float[3, 4, 5]; // трехмерный массив

B[0] = new bool[10];
B[1] = new bool[15];
B[2] = new bool[20];

int d;
d = UI.Length; // d = 200*10 = 2000
d = B[0].Length; // d = 10
d = B[1].Length; // d = 15
d = B.Length; // d = 3
d = F.Length; // d = 3*4*5 = 60

 

5. Пример вычисления суммы элементов массива с использованием свойства Length
// сумма элементов одномерного массива
int[] A = new int[10]; // объявление массива

// заполнение массива произвольными значениями
for (int i = 0; i < A.Length; i++)
    A[i] = i;

// вычисление суммы элементов массива
int s = 0;
for (int i = 0; i < A.Length; i++)
    s = s + A[i];

// s = 45

 

6. Каким образом можно применить свойство Length для ступенчатых массивов?

Для ступенчатых массивов свойство Length можно применять как для целого массива в целом, так и для каждого массива, что есть строкой (row).
В первом случае (для целого массива в целом) свойство Length возвращает количество строк в массиве. В случае каждой строки, свойство Length возвращает длину каждой строки.

// свойство Length для ступенчатых массивов
int[][] A = new int[5][];

A[0] = new int[10];
A[1] = new int[20];
A[3] = new int[25];

int d, d1, d2, d3;

d = A.Length; // d = 5;
d1 = A[0].Length; // d = 10
d2 = A[1].Length; // d = 20
//d3 = A[4].Length; - ошибка, не существует ссылки на A[4]

 


Связанные темы