В приведенных выше примерах применения двумерного массива, по существу, соз давался так называемый прямоугольный массив. Двумерный массив можно представить в виде таблицы, в которой длина каждой строки остается неизменной по всему масси ву. Но в C# можно также создавать специальный тип двумерного массива, называемый ступенчатым массивом. Ступенчатый массив представляет собой массив массивов, в ко тором длина каждого массива может быть разной. Следовательно, ступенчатый массив может быть использован для составления таблицы из строк разной длины.
Ступенчатые массивы объявляются с помощью ряда квадратных скобок, в которых указывается их размерность. Например, для объявления двумерного ступенчатого мас сива служит следующая общая форма: тип[][] имя_массива = new тип[размер][];
где размер обозначает число строк в массиве. Память для самих строк распределяется индивидуально, и поэтому длина строк может быть разной. Например, в приведенном ниже фрагменте кода объявляется ступенчатый массив jagged. Память сначала рас пределяется для его первого измерения автоматически, а затем для второго измерения вручную. int[][] jagged = new int[3][]; jagged[0] = new int[4]; jagged[1] = new int[3]; jagged[2] = new int[5];
После выполнения этого фрагмента кода массив jagged выглядит так, как показа но ниже.
Теперь нетрудно понять, почему такие массивы называются ступенчатыми! После создания ступенчатого массива доступ к его элементам осуществляется по индексу, указываемому в отдельных квадратных скобках. Например, в следующей строке кода элементу массива jagged, находящемуся на позиции с координатами (2,1), присваи вается значение 10. jagged[2][1] = 10;
Обратите внимание на синтаксические отличия в доступе к элементу ступенчатого и прямоугольного массива.
В приведенном ниже примере программы демонстрируется создание двумерного ступенчатого массива. // Продемонстрировать применение ступенчатых массивов. using System; class Jagged { static void Main { int[][] jagged = new int[3][]; jagged[0] = new int[4]; jagged[1] = new int[3]; jagged[2] = new int[5]; int i; // Сохранить значения в первом массиве. for(i=0; i < 4; i++) jagged[0] [i] = i; // Сохранить значения во втором массиве. for(i=0; i < 3; i++) jagged[1][i] = i; jagged [0][0] jagged [1][0] jagged [2][0] jagged [0][1] jagged [1][1] jagged [2][1] jagged [0][2] jagged [0][3] jagged [1][2] jagged [2][2] jagged [2][3] jagged [2][4] // Сохранить значения в третьем массиве. for(i=0; i < 5; i++) jagged[2][i] = i; // Вывести значения из первого массива. for(i=0; i < 4; i++) Console.Write(jagged[0][i] + " "); Console.WriteLine; // Вывести значения из второго массива. for(i=0; i < 3; i++) Console.Write(jagged[1][i] + " "); Console.WriteLine; // Вывести значения из третьего массива. for(i=0; i < 5; i++) Console.Write(jagged [2] [i ] + " ") ; Console.WriteLine; } }
Выполнение этой программы приводит к следующему результату. 0 1 2 3 0 1 2 0 1 2 3 4
Ступенчатые массивы находят полезное применение не во всех, а лишь в некоторых случаях. Так, если требуется очень длинный двумерный массив, который заполняется не полностью, т.е. такой массив, в котором используются не все, а лишь отдельные его элементы, то для этой цели идеально подходит ступенчатый массив.
И последнее замечание: ступенчатые массивы представляют собой массивы масси вов, и поэтому они не обязательно должны состоять из одномерных массивов. Напри мер, в приведенной ниже строке кода создается массив двумерных массивов. int[][,] jagged = new int[3][,];
В следующей строке кода элементу массива jagged[0] присваивается ссылка на массив размерами 4x2. jagged[0] = new int[4, 2];
А в приведенной ниже строке кода элементу массива jagged[0][1,0] присваива ется значение переменной i. jagged[0][1,0] = i; Присваивание ссылок на массивы