Лабораторный практикум по основам языка C/С++ |
Тема 3.2. Одномерные массивы
3.2.1. Описание и заполнение массива
Массив - это пронумерованная совокупность однотипных данных. Каждое значение в массиве называется элементом массива, а номер элемента массива - индексом.
Если каждое значение в совокупности имеет только один индекс (номер), необходимый, для того, чтобы обратиться к нему, то массив называется одномерным. Типичным примером одномерного массива является вектор. Если для обращения к элементу массива необходимо указать два индекса, то массив называется двумерным. Типичным примером двумерного массива является матрица.
В C и С++ нумерация элементов массива всегда начинается с нуля. Ниже приведен пример использования одномерного массива. Массив описывается (строка 9), затем он заполняется случайными числами из указанного пользователем диапазона. И в конце выводится на экран.
Конечно же эти два цикла можно было объединить в один, то есть сразу после присвоения значения элементу массива, вывести его на экран. В примере эти две операции (заполнение массива и вывод массива) разделены только для того, чтобы показать каждую из них в отдельности
3.2.2. Динамические массивы
Если размер массива задется при его описании, то такие массивы называются статическими. Размер таких массивов нельзя изменить в процессе работы программы.
Однако разработчик не всегда знает каков будет размер поступающих в программу данных. Например, никогда нельзя точно сказать сколько человек будет в группе на момент начала занятий. Для первого курса это означает, что может поступить больше или меньше человек, чем планировалось. Для старших курсов это означает, что после сессии кого-то могут отчислить или восстановить.
Массивы размер которых не задается при их описании и может быть установлен и/или изменен в ходе работы программы, называются динамическими.
Следует отметить, что с точки зрения языка С/С++ любой массив представляет собой указатель на первый элемент. Это верно даже для статических массивов. Поэтому для описания динамического массива достаточно описать указатель соответствующего типа, выделить область памяти соответствующего размера и записать в указатель адрес первой ячейки этой области памяти.
Посмотрите на приведенный ниже пример. Пусть необходимо сгенерировать массив, а затем заменить в нем все отрицательные значения на их модули.
В строке 7 описывается указатель, который будет
использоваться как динамический массив. В строках 11-12 у пользователя
запрашивается размер массива. В строке 17 выделяется память для массива того размера, который
указал пользователь. Далее, при генерации массива (строки 21-25), происходит обращение к элементам динамического
массива по индексам, также как и в случае статического массива. Для демонстрации того, что
при обращении с элементами массива можно использовать арифметику указателей, изменение и
вывод измененного массива происходит по другому (строки 28-33). Поскольку vec
является
указателем, то мы задаем смещение, равное номеру элемента, а затем разыменовываем указатель.
Следует отметить, что и к элементам статического массива также можно обращаться по указателю со смещением.