Рассмотрим одномерные массивы

Структурированный тип данных

Это данные, определяющие упорядоченную совокупность скалярных переменных (char, int, float, double, …) и характеризуемые типом своих компонент.

К ним относят: массивы, структуры, объединения, указатели, динамические структуры (стеки, очереди, списки), классы.

Остановимся на массивах.

Массивы

Массив — это составной, структурированный тип данных одного заранее определенного типа, который имеет следующие характеристики:

* элементы массива имеют одинаковый тип (в отличие от структур), поэтому каждый элемент массива занимает одинаковый объём памяти;

* массив располагается в оперативной памяти (в отличие от файлов);

* элементы массива упорядочены и занимают подряд идущие ячейки (в отличие от динамических структур: стеков, очередей, списков).

По своей структуре массивы данных могут быть одномерными (векторами размера 1*n или n*1), двухмерными (матрицами размера n*m) или многомерными (размера n*m*p...).

С точки зрения времени распределения памяти под массив они делятся на статические и динамические.

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

Для имени массива может быть использована переменная, состоящая из символов (буквы) латинского алфавита с цифрами и знаком подчеркивания и т.д. в соответствии с правилами написания имен идентификаторов, принятых в языке С/С++.

Доступ к элементам массива в языке С/С++ осуществляется двумя способами.

1) С помощью порядкового номера элемента массива, который называется индексом. В качестве индекса можно использовать выражение целого или совместимого с ним типа, в том числе константу или переменную.

Замечание. В качестве индекса нельзя использовать выражение вещественного типа.

2) С помощью указателя (адреса) на первый элемент массива, т. к. в С/С++ существует связь между массивами и указателями.

 

 

Рассмотрим одномерные массивы.

 

Массив называется одномерными, если элементы массива располагаются строго последовательно. При этом элемент массива имеет один индекс (одну размерность), определяющий порядковый номер элемента в массиве.

Формат описания одномерного массива:

<тип> <имя_массива> [размер];

Здесь <тип>— тип элементов массива (int, float, char, структуры), <имя_массива>записывается по правилам идентификаторов; <размер> - размерность массива, количество его элементов в виде целочисленной константы или константного выражения. Эта величина определяет количество ячеек оперативной памяти, зарезервированной для массива.

Например:

а) float A[10];

б) const n=10; float A[n];

Здесь преимущество второго способа, с предварительным объявлением размерности в виде константы, заключается в следующем - если надо будет изменить размерность массива, то это достаточно сделать в одном месте программы при определении константы.

Для статического массива, на этапе компиляции, резервируется память для размещения n чисел указанного типа (10 вещественных чисел), при этом для него требуется память объёмом k*n байт (4*10), где k — необходимое количество байт для размещения одного элемента указанного типа (одного числа типа float). Эта память сохраняется на всё время выполнения программы, а точнее, функции или блока, где описан массив.

Программно необходимый объём памяти определяется с помощью операции sizeof, например:

M=sizeof (<тип>) * n;

или M= sizeof (<имя_масива>);

или M= sizeof <имя_масива>;

где M — переменная целого типа, определяющая размер массива в байтах. Тип обязательно записывается в скобках, а имя может быть без скобок.

Далее программа выведет дважды число 40.

float A[10]; int M1, M2;

M1=sizeof(float)*10; // но M1=sizeof float *10;— ошибка!

M2=sizeof(A); // или M2=sizeof A;

cout<<M1<<endl<<M2;

При работе с массивом необходимо помнить, что нумерация элементов массива начинается с 0. Тогда A[n-1] — последний элемент массива. Это связано с использованием указателей при работе с массивами. Поэтому в нашем примере индекс элементов массива может изменяется от 0 до 9 включительно, то есть индекс последнего элемента массива на единицу меньше его размерности. Объявленные 10 элементов массива обозначаются следующим образом: A[0], A[1], A[2] ,…, A[9].

Замечание. В языке С/С++ отсутствует проверка границ массивов, поэтому возможна ситуация выхода за его границы. Выходя за границы массивы можно записать значение в некоторую переменную или даже в код программы, что может привести к неожиданным результатам. О таком контроле должен позаботиться программист.

При использовании статических массивов возникают ситуации, когда размер массива заранее не известен. В этом случае описывается массив с максимальной размерностью. Реальную размерность вводим и используем далее, например, в циклах и для других целей:

const nmax=100;

float X[nmax];

int n;

cout<<”Введите размер массива ”;

cin>>n;

// Дальше работаем с n (а не с nmax) элементами массива, например, вводим их

for (int i=0; i<n; i++)

{

cout<<”X[“<<i<<”]=”;

cin>>X[i];

}

Замечание. Такой способ проще, но неэффективен с точки зрения распределения памяти, так как “заказываем” больше памяти, чем реально используем. В таких случаях профессионально используются динамические массивы.