Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
программирование 4-10 подробная версия .docx
Скачиваний:
0
Добавлен:
08.01.2020
Размер:
297.11 Кб
Скачать

9. Массивы: одномерные и многомерные, статические и динамические – описание и внутреннее представление; параметры-массивы открытого типа в процедурах и функциях. Примеры.

Массив – это тип данных, содержащий (хранящий) пронумерованные значения.

Каждое пронумерованное значение называется элементом массива, а число, с ко_

торым связывается элемент, называется его индексом. Так как JavaScript – это

нетипизированный язык, элемент массива может иметь любой тип, причем разные элементы одного массива могут иметь разные типы. Одномерный массив - это самый простой вариант массива, использующий обыкновенный список данных. Элементы массива могут даже содержать другие массивы, что позволяет создавать массивы массивов. Массив массивов является многомерным массивом.

Массивы, не меняющие число своих элементов, называются статическими массивами. Однако бывают ситуации, когда изначально неизвестно количество элементов в массиве, или же, в процессе работы это количество может изменяться. Такие массивы называются динамическими массивами.

Динамический массив может увеличиваться или сжиматься, чтобы вмещать точно необходимое число элементов без напрасного расходования памяти.

Статические массивы существуют в Паскале очень давно. Они всегда имеют фиксированный размер и объявляются следующим образом: type tarray = array [0..15] of integer; var a: tarray; Динамические массивы появились с приходом delphi. Их основное удобство заключается в возможности изменения размера. Объявление динамического массива: type tdynarray = array of integer; var b: tdynarray;

Переменная динамического массива (в нашем примере b) представляет собой обычный указатель (4 байта). В отличие от статического массива, где переменная (в нашем примере А) является хранилищем данных массива и имеет размер, равный произведению количества элементов на их размер. На что же указывает переменная динамического массива? На некую область памяти, где лежат собственно данные массива. То есть фактически на первый элемент массива. Но самое интересное, что по отрицательному смещению (то есть перед данными) лежат еще 2 четырехбайтовых счетчика. По смещению -4 находится индикатор количества элементов в массиве, а по смещению -8 находится счетчик ссылок на массив. То есть размер динамического массива всегда на 8 байт больше того, что занимают его элементы. За исключением того случая, когда количество элементов равно 0. Тогда переменная динамического массива никуда не указывает и имеет значение nil. Зачем нужен счетчик ссылок? Он позволяет иметь несколько переменных, ссылающихся на одни и те же данные в массиве и не заботиться об управлении памятью. Компилятор самостоятельно следит за доступом к данным и при уменьшении счетчика ссылок до 0 освобождает всю память массива. Пример:

Все в динамических массивах хорошо. Но иногда приходится отказываться от такой удобной возможности.  Дело в том, что доступ к элементам динамического массива примерно в три раза медленнее, чем у статического массива (по моим измерениям). Если размер данных фиксирован и все операции с ними производятся в одном месте кода, то можно просто заменить динамический массив статическим. В случае интенсивной работы с элементами больших массивов (например, сортировка), когда число элементов в массиве меняется, а доступ к ним производится из разных объектов или модулей, то есть смысл отказаться от обоих типов массивов и перейти к работе через указатель на статический массив. Это довольно простой метод, позволяющий при минимуме дополнительного кодирования получить скорость статических массивов и гибкость динамических.

(Примеры на языке С# (C sharp))

О работе с одномерными массивами нужно знать основные вещи. Это - объявление, инициализация, и доступ к элементам массива.

  1. объявление

<тип массива>[]    <имя массива>; int[] arr; char[] ch; double[] db1, db2;

Обратите внимание, что при объявлении массива в C sharp, квадратные скобки пишутся возле типа массива, а не его имени.

  1. инициализация

Существует несколько форм инициализации массива. Вот наглядная иллюстрация каждой из них:

int[] arr = new int[6]; // выделяем для массива область в 6 элементов //сразу инициализировать элементы нам так же ни кто не запрещает char[] ch = new int[6] {'a', 'b', 'c', 'd', 'e', 'f'}; char[] ch = new int[] {'a', 'b', 'c', 'd', 'e', 'f'}; char[] ch = {'a', 'b', 'c', 'd', 'e', 'f'};

Последние три примера являются идентичными. Поэтому пользуйтесь тем, который вам будет понятнее и удобнее.

  1. доступ к элементам

Доступ к элементам одномерного массива осуществляется по средствам индексатора. Причем вы можете, как получать значения элементов массива, так и задавать их:

int[] ob1 = new int[3] {8,9,3}; int zn1 = ob1[0]; int zn2 = ob1[1];  int zn3 = ob1[2];  ob1[0] = 22;

Не забывайте, что все элементы массива начинаются с индекса - 0. Его, к сожалению, ни как не поменять.