Тема 3.2. Одномерные массивы

3.2.1. Описание и заполнение массива

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

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

В C и С++ нумерация элементов массива всегда начинается с нуля. Ниже приведен пример использования одномерного массива. Массив описывается (строка 9), затем он заполняется случайными числами из указанного пользователем диапазона. И в конце выводится на экран.

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

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

Если размер массива задется при его описании, то такие массивы называются статическими. Размер таких массивов нельзя изменить в процессе работы программы.

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

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

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

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

В строке 7 описывается указатель, который будет использоваться как динамический массив. В строках 11-12 у пользователя запрашивается размер массива. В строке 17 выделяется память для массива того размера, который указал пользователь. Далее, при генерации массива (строки 21-25), происходит обращение к элементам динамического массива по индексам, также как и в случае статического массива. Для демонстрации того, что при обращении с элементами массива можно использовать арифметику указателей, изменение и вывод измененного массива происходит по другому (строки 28-33). Поскольку vec является указателем, то мы задаем смещение, равное номеру элемента, а затем разыменовываем указатель.

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