Массивы чрезвычайно важная тема в C++. В программах они используются очень часто и разобраться в этой теме необходимо досконально. Сразу вас обрадую – понять и научиться применять массивы достаточно просто даже начинающему.
Итак, зачем же нужны массивы и что они из себя представляют? К настоящему моменту вы уже хорошо знаете, что данные программы хранятся в объявленных нами переменных определённого типа (int, double, char… ). Но бывает так, что программе необходимо хранить сотни (а то и больше) переменных однотипных данных, а также необходимо с ними работать – присваивать значения, изменять их и т.д.
К примеру, надо хранить порядковые номера строк. Согласитесь – любому станет страшно от мысли, что надо создать пятьсот переменных типа int, каждой дать уникальное имя и присвоить значение от 1-го до 500-та. (мне уже страшно :) В таком случае, массивы нас просто спасут.
Отметим основное и перейдем к практическому примеру:
- массив в С++ – это совокупность определенного количества однотипных переменных, имеющих одно имя. К примеру, int array [3];. Эта запись означает, что мы объявили массив с именем array , который содержит в себе 3 переменные типа int;
- переменные массива называют элементами ;
- каждый элемент имеет свой уникальный индекс – свой порядковый номер. Используя индекс мы можем обращаться к конкретному элементу. ВАЖНО – индексация элементов массива начинается с 0. Так в массиве int array [3] первый элемент имеет индекс 0, а последний – 2. Чтобы обратиться, например, к нулевому элементу массива и изменить его значение, надо указать имя массива и в квадратных скобках указать индекс элемента – array [0] = 33.
Рассмотрим пример:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | // в этой программе создаем массив с размером size, // с помощью цикла for вносим данные во все ячейки // массива и отображаем их содержимое на экран #include <iostream> using namespace std; int main() { setlocale(LC_ALL, "rus"); const int SIZE = 10; //объявляем константу int firstArray[SIZE ]; //объявляем массив с количеством элементов SIZE for (int i = 0; i < SIZE ; i++) //заполняем и отображаем значения на экран { firstArray[i] = i + 1; // на первом шаге цикла firstArray[0] присвоить 1 (0 + 1) cout << i << "-я ячейка хранит число " << firstArray[i] << endl; } cout << endl; return 0; } |
В строке 12 мы определяем целочисленную константу SIZE, которая будет хранить размер массива (определённое нами, количество его элементов). В строке 13 объявляем массив: указываем тип данных, которые будут храниться в ячейках массива, даем имя и указываем размер в квадратных скобках.
Важно, что в квадратные скобки мы можем записывать только целые константные значения. Надо либо сразу вписать целое число в квадратные скобки при объявлении массива (int firstArray[100];), либо определить целочисленную константу до объявления массива и ввести в квадратные скобки имя этой константы (как в нашем примере).
Второй способ использовать предпочтительней, если в ходе программы вам придется несколько раз обращаться к массиву через цикл. Объясняется это тем, что когда мы объявляем цикл, в нём можно указать условие изменения счетчика до значения SIZE.
Вот представьте, что нам необходимо изменить размер массива с 10 элементов на 200. В этом случае, нам остаётся всего на всего изменить значение целочисленной константы, и таким образом у нас автоматически подставятся новые значения размера и в массив, и во все циклы программы.
Можете попробовать в нашем примере внести любую другую цифру в константу SIZE. И вы увидите, что программа будет прекрасно работать – создаст массив на столько элементов, на сколько вы укажете, внесет данные и отобразит их на экране.
В строках 15 – 19 определяем цикл for. Его счетчик i будет служить индексом элементов массива. В самом начале, он равен 0 и с каждым шагом будет увеличиваться на единицу до тех пор, пока не станет равным SIZE – количеству элементов массива.
Обратите внимание, в одном цикле мы и присваиваем различные значения элементам массива и в следующей строке обращаемся к ним, чтобы вывести данные, которые они хранят, на экран.
Запускаем программу и видим результат:
Присвоить значение элементам массива можно разными способами – инициализировать его при создании либо с помощью цикла. Если размер массива большой, есть прекрасная возможность использовать цикл for или while для инициализации его элементов. Так мы сделали в нашем примере. Можно заполнить массив случайными числами – об этом у нас есть отдельная статья.
А если массив совсем небольшой, к примеру на 5 элементов, инициализировать его можно сразу при объявлении:
Так элементу с индексом 0 – firstArray[0] – будет присвоено значение 11, а последнему элементу массива firstArray[4] – значение 15. Есть такая фишка – вы можете не указывать размер массива в квадратных скобках и сделать такую запись:
Предыдущая запись эквивалентна этой. Только во втором случае компилятор автоматически вычислит размер массива, по количеству данных в фигурных скобках.
Так же при начальной инициализации элементов массива, когда массив необходимо очистить от «мусора» (остаточных данных других программ в памяти) лучше сразу присвоить всем элементам значение 0. Это выглядит так:
Следует запомнить, что такая инициализация возможна только для заполнения нулями. Если необходимо заполнить элементы массива какими-либо другими числами, лучше применять цикл. В C++11 (стандарт кодирования) при использовании списковой инициализации (инициализации с фигурными скобками) разрешается даже отбросить знак = .
Хочется показать еще один прием инициализации при создании массива. К примеру, для массива из 30-ти элементов нам надо внести значения 33 и 44 только в ячейки с индексом 0 и 1 соответственно, а остальные заполнить нулями. Тогда делаем так:
эти данные будут внесены в нулевую и первую ячейки, а остальные автоматически примут значение 0.
Организовать заполнение массива можно и при помощи оператора cin:
1 2 3 4 5 | for (int i = 0; i < size; i++) //заполняем и выводим значения на экран { cout << "Введите значение в ячейку №" << i << " :"; cin >> firstArray[i]; } |
Чтобы присвоить или изменить значение конкретного элемента, надо обратиться к нему, используя его индекс. К примеру, все значения массива из 500-та элементов нас устраивают, но необходимо изменить значение лишь одного. Тогда мы обращаемся к нему по его индексу : firstArray[255] = 7;
С этим разобрались, теперь давайте посмотрим, каким же образом массив располагается в оперативной памяти. Массив типа int из пяти элементов займет 20 байт памяти – 4 байта (int) * 5 (количество элементов) – и эти данные будут располагаться в памяти последовательно, как показано на рисунке:
Подведем итог и отметим всё самое важное о массивах:
- синтаксис объявления массива :
тип_Данных_Массива имя_Массива [размер];
- переменные массива называются элементами, а каждый элемент имеет свой порядковый номер – индекс.
- нумерация индексов элементов массива начинается с нуля!!!
- инициализировать массив можно только при его создании – int firstArray[3] = {1, 2, 3}; Выполнять инициализацию позже уже не допускается:
firstArray[3] = {1, 2, 3};Если массив не был инициализирован в начале, можно присвоить значения его элементам, используя циклы или просто обращаясь к необходимому элементу через его индекс.
- инициализировать массив можно только при его создании – int firstArray[3] = {1, 2, 3}; Выполнять инициализацию позже уже не допускается:
- массив может быть одномерным – таким, как рассмотрен в этом примере, и многомерным – двумерным, трехмерным… (их мы рассмотрим в одной из наших следующих статей).
Не забывайте о необходимости практиковаться в решении задач – Задачи: Массивы в C++. Хотите узнать больше о массивах в C++ (в том числе о символьных массивах и строках)? Посмотрите эти видео-уроки:
Тепер я знаю, як просто зберігати безліч однотипних даних з допомогою масивів в С++. Дякую за доступність викладання матеріалу!
Массивы в С++ – це те що я шукала!!! Мерсі велике Вам за роботу
Когда отмечал самое важное, надо было указать, что произвольный доступ к элементу массива выполняется за O(1). В тексте статьи ИМХО стоит пояснить, что такое время произвольного доступа обеспечивается тем, что размер элементов массива фиксирован и элементы располагаются в памяти последовательно.
Как-то красиво нарисовать картинку для примера типа:
[code]
int a[99];
a[5] = 1; // эквивалентно (a + sizeof(int) * 5) = 1
[/code]
Т.е. обращение к элементу a[99999] произойдет также быстро, как к a[2], например.
Можно это как-то красиво нарисовать.
Это во многом ключевой момент, т.к. время доступа – это один из ключевых факторов выбора структуры данных, к которым относятся массивы.
Т.к. это вводная статья, можно сравнивать массивы с другими структурами данных, очень поверхностно, не вдаваясь в детали реализации других структур. Посмотреть такие сравнения можно в книжках по алгоритмам, например у Скиены.
Я бы тут же про динамические массивы написал. Статью вообще удалил бы и написал бы заново. В статье куча ляпов и неточностей. С терминологией беда.
Все вот эти преамбулы я бы убрал:
[quote]
Массивы чрезвычайно важная тема в С++.
Сразу вас обрадую – понять и научиться применять массивы достаточно просто даже начинающему.
Отметим основное и перейдем к практическому примеру:
Ну и еще один способ присвоения значений – это обращаться к каждому элементу массива отдельно.
….
[/quote]
Просто сравни 2 фрагмента:
[quote]
массив в С++ – это совокупность определенного количества однотипных переменных, имеющих одно имя – к примеру, int array [3];. Эта запись означает, что мы объявили массив с именем array , который содержит в себе 3 переменные типа int;
переменные массива называют элементами ;
каждый элемент имеет свой уникальный индекс – свой порядковый номер. Используя индекс мы можем обращаться к конкретному элементу. ВАЖНО – индексация элементов массива начинается с 0. Так в массиве int array [3] первый элемент имеет индекс 0, а последний – 2. Чтобы обратиться, к примеру, к нулевому элементу массива и изменить его значение, надо указать имя массива и в квадратных скобках указать индекс элемента – array [0] = 33.
[/quote]
[quote]
синтаксис объявления массива :
тип_Данных_Массива имя_Массива [размер];
посмотрев на синтаксис можно дать определение: массив – это определенное количество однотипных данных, объединенных общим именем.
переменные массива называются элементами, а каждый элемент имеет свой порядковый номер – индекс.
нумерация элементов массива начинается с нуля!!!
инициализировать массив можно либо при его создании, либо используя циклы.
массив может быть одномерным – таким, как рассмотрен в этом примере, и многомерным – двумерным, трехмерным… (их мы рассмотрим в одной из наших следующих статей).
[/quote]
>> В строке 7 мы определяем целочисленную константу size, которая будет хранить
В строке 7 написано “int main”.
Владимир, спасибо за Ваши комментарии. Думаю, многим будет нелишним почитать дополнительную информацию о массивах.
Что касается написания статей – ориентируюсь на новичков в программировании и стараюсь писать максимально доступно. Вам, как специалисту , это конечно кажется примитивным, но начинающие программисты оценят. Кому понадобится более глубокое рассмотрение темы, тот не одну книгу еще прочитает.
p.s. Номера строк – изменили.
Ну окей, чтобы тыщу раз не говорить:
“нумерация элементов массива начинается с нуля!!!”
просто называй первый элемент нулевым.
Инициализация с фигурными скобками – это тонкость, которая, ИМХО, новичкам вообще не особ нужна. Не все компиляторы это поддерживают. А если статья ориентируется на студентов, то надо учесть, что в наших ВУЗах любят давать студентам всякие античные компиляторы типа BC3.1.
интересно, почему ВУЗы дают эти “античные” компиляторы, если visual express в свободном доступе
не не слышал что б вузы нам что-то навязывали старое! конечно, хочешь в Code::Blocks пиши, хоч в Visual Studio, не помню когда под Борланд что писал, но помнят руки старые времена!!!
смешно вспомнить но начинал с Dev-C++ айдишки) эх было время!
Владимир, во-первых этот сайт для начинающих, так что не стоит строго судить всё что тут написано! Как мне кажется, то новичкам тут будет самое то! Не надо тут говорить как кому учиться, я думаю что многие разберутся. Во-вторых, если у Вас есть замечания по тексту, или исправления ошибок – то Орфус Вам в помощь, не надо засорять чат!
В-третьих, по-моему автор сайта лучше знает как излагать код, не надо тут навязывать своего мнения, как надо что делать, это же обучаловка для будущих тру программеров, а не для профи, так что “Инициализация с фигурными скобками – это тонкость, которая, ИМХО, новичкам вообще не особ нужна”, считаю этот текст глупым, ведь это тонкости языка (!), и тут всё важно, нужно всё знать, как и что пишется, что бы в будущем в чужом коде не таращить глаза “а это что такое и почему”!!!
Всего хорошего! Да прибудет Буст в Вами!
Так народ, не мешайте Админу работать!!!_) Он и сам знает какой материал выкладывать… принимаются только дельные советы и замечания! Не забывайте, видите ошибку, “бейте” в Орфус, Ctrl + Enter Вам в помощь!!!