Массив (программирование)

Массив (программирование)

Индексный массив (в некоторых языках программирования также таблица, ряд) — именованный набор однотипных переменных, расположенных в памяти непосредственно друг за другом (в отличие от списка), доступ к которым осуществляется по индексу.

Индекс массива — целое число, либо значение типа, приводимого к целому, указывающее на конкретный элемент массива.

В ряде скриптовых языков, например PHP, ассоциативные массивы, в которых переменные не обязаны быть однотипными, и доступ к ним не обязательно осуществляется по индексу.

Содержание

Общее описание

Массив — Упорядоченный набор данных, для хранения данных одного типа, идентифицируемых с помощью одного или нескольких индексов. В простейшем случае массив имеет постоянную длину и хранит единицы данных одного и того же типа.

Количество используемых индексов массива может быть различным. Массивы с одним индексом называют одномерными, с двумя — двумерными и т. д. Одномерный массив нестрого соответствует вектору в математике, двумерный — матрице. Чаще всего применяются массивы с одним или двумя индексами, реже — с тремя, ещё большее количество индексов встречается крайне редко.

Пример статического массива на Паскале -

  wordArray  : array [Word] of Integer;     // Статический, размер = High(Word) + 1
  multiArray : array [Byte, 1..5] of Char;  // Статический массив, 2 измерения
  rangeArray : array [5..20] of String;     // Статический массив, размер = 16

Пример статического массива на Си -

  int Array[10];         // Статический, размер 10, базовый тип данных - целое число (int)
  double Array[12][15];  // Статический массив, 2 измерения, базовый тип данных - число
                         // с дробной частью (double)

Поддержка индексных массивов (свой синтаксис объявления, функции для работы с элементами и т. д.) есть в большинстве высокоуровневых языков программирования. Максимально допустимая размерность массива, типы и диапазоны значений индексов, ограничения на типы элементов определяются языком программирования и/или конкретным транслятором.

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

Объявление типа «массив» в Паскале -

  type
    TArrayType = array [0..9] of Integer; (* Объявления типа "массив" *)
  var
    arr1, arr2, arr3: TArrayType; (* Объявление трёх переменных-массивов одного типа *)

Специфические типы массивов

Динамические массивы

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

Пример динамического массива на Delphi

  byteArray  : Array of Byte;           // Одномерный массив
  multiArray : Array of Array of string;  // Многомерный массив


Пример динамического массива на Си

  float *array1; // Одномерный массив 
  int **array2; // Многомерный массив
  array1=(float*)malloc(10*sizeof(float)); // выделение 10 блоков по sizeof(float)байт каждый 
  array2=(int**)malloc(16*sizeof(int));   // выделение 16*8 блоков по sizeof(int) байт каждый
  for(i=0;i<16;i++)
  array2[i]=(int*)malloc(8*sizeof(int));

Гетерогенные массивы

Гетерогенным называется массив, в разные элементы которого могут быть непосредственно записаны значения, относящиеся к различным типам данных. Массив, хранящий указатели на значения различных типов, не является гетерогенным, так как собственно хранящиеся в массиве данные относятся к единственному типу — типу «указатель». Гетерогенные массивы удобны как универсальная структура для хранения наборов данных произвольных типов. Отсутствие их поддержки в языке программирования приводит к необходимости реализации более сложных схем хранения данных. С другой стороны, реализация гетерогенности требует усложнения механизма поддержки массивов в трансляторе языка.

Массивы массивов

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

Реализация

Стандартным способом реализации статических массивов с одним типом элементов является следующий:

  1. Под массив выделяется непрерывный блок памяти объёмом S*m1*m2*m3…mn, где S — размер одного элемента, а m1…mn — размеры диапазонов индексов (то есть количество значений, которые может принимать соответствующий индекс).
  2. При обращении к элементу массива A[i1, i2, i3, … in] адрес соответствующего элемента вычисляется как B+S*(i1p*m1+i2p*m2+…+i(n-1)p*mn-1+inp), где B — база (адрес начала блока памяти массива), ikp-значение k-го индекса, приведённое к целому с нулевым начальным смещением.

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

Первый элемент массива, в зависимости от языка программирования, может иметь различный индекс. Различают три основных разновидности массивов: с отсчетом от нуля (zero-based), с отсчетом от единицы (one-based), и с отсчетом от специфического значения заданного программистом (n-based). Отсчет индекса элемента массивов с нуля более характерен для низкоуровневых ЯП, однако этот метод был популяризирован в языках более высокого уровня языком программирорования С.

Более сложные типы массивов — динамические и гетерогенные — реализуются сложнее.

Достоинства

  • легкость вычисления адреса элемента по его индексу (поскольку элементы массива располагаются один за другим)
  • одинаковое время доступа ко всем элементам
  • малый размер элементов: они состоят только из информационного поля

Недостатки

  • для статического массива — отсутствие динамики, невозможность удаления или добавления элемента без сдвига других
  • для динамического и/или гетерогенного массива — более низкое (по сравнению с обычным статическим) быстродействие и дополнительные накладные расходы на поддержку динамических свойств и/или гетерогенности.
  • при работе с массивом в стиле C (с указателями) и при отсутствии дополнительных средств контроля — угроза выхода за границы массива и повреждения данных

См. также

Ссылки


Wikimedia Foundation. 2010.

Игры ⚽ Поможем написать реферат

Полезное


Смотреть что такое "Массив (программирование)" в других словарях:

  • Массив — У этого термина существуют и другие значения, см. Массив (значения). Эту страницу предлагается переименовать в Массив (информатика). Пояснение причин и обсуждение  на странице Википедия:К переименованию/4 ноября 2012. Возможно, её …   Википедия

  • Класс (программирование) — У этого термина существуют и другие значения, см. Класс. Класс в программировании набор методов и функций. Другие абстрактные типы данных  метаклассы, интерфейсы, структуры, перечисления  характеризуются какими то своими, другими… …   Википедия

  • Коллекция (программирование) — У этого термина существуют и другие значения, см. Коллекция. Для улучшения этой статьи желательно?: Найти и оформить в виде сносок ссылки на авторитетные исто …   Википедия

  • Интерфейс (объектно-ориентированное программирование) — У этого термина существуют и другие значения, см. Интерфейс (значения). Интерфейс (от лат. inter  «между», и face  «поверхность»)  семантическая и синтаксическая конструкция в коде программы, используемая для специфицирования… …   Википедия

  • Полиморфизм (программирование) — У этого термина существуют и другие значения, см. Полиморфизм. Эта статья или раздел нуждается в переработке. Пожалуйста, улучшите статью …   Википедия

  • Функциональное программирование — Парадигмы программирования Агентно ориентированная Компонентно ориентированная Конкатенативная Декларативная (контрастирует с Императивной) Ограничениями Функциональная Потоком данных Таблично ориентированная (электронные таблицы) Реактивная …   Википедия

  • Автоматное программирование — Автоматное программирование  это парадигма программирования, при использовании которой программа или её фрагмент осмысливается как модель какого либо формального автомата. В зависимости от конкретной задачи в автоматном программировании… …   Википедия

  • Объект (программирование) — У этого термина существуют и другие значения, см. Объект (значения). Объект в программировании  некоторая сущность в виртуальном пространстве, обладающая определённым состоянием и поведением, имеющая заданные значения свойств (атрибутов) и… …   Википедия

  • Очередь (программирование) — У этого термина существуют и другие значения, см. Очередь. Очередь  структура данных с дисциплиной доступа к элементам «первый пришёл  первый вышел» (FIFO, First In  First Out). Добавление элемента (принято обозначать словом… …   Википедия

  • Ссылка (программирование) — В этой статье не хватает ссылок на источники информации. Информация должна быть проверяема, иначе она может быть поставлена под сомнение и удалена. Вы можете …   Википедия


Поделиться ссылкой на выделенное

Прямая ссылка:
Нажмите правой клавишей мыши и выберите «Копировать ссылку»