Массивы в C++: пошаговый разбор для начинающих
К концу разбора вы объявите массив, заполните его, пройдёте циклом и поймёте, почему индексы начинаются с нуля и что происходит при выходе за границы. Займёт около получаса.

К концу этого разбора у вас будет рабочая программа на C++, которая создаёт массив чисел, заполняет его значениями, считает сумму и находит максимум. Попутно вы поймёте, почему индексация идёт с нуля, чем массив отличается от std::vector и что происходит, когда вы обращаетесь к несуществующему элементу. На всё уйдёт минут двадцать-тридцать, если вы уже умеете компилировать и запускать простую программу.
Код проверен на стандарте C++17 и компиляторах GCC 13 и Clang 17. Более старые компиляторы (GCC 9 и новее) тоже подойдут — ничего экзотического мы не используем.
Что нужно иметь до начала
Прежде чем писать код, убедитесь, что окружение готово:
- компилятор C++: GCC (
g++) или Clang (clang++), либо MSVC в Visual Studio; - умение скомпилировать и запустить программу из одного файла — если вы уже выводили
Hello, world, этого достаточно; - текстовый редактор или IDE — подойдёт VS Code, CLion или обычный Notepad++.
Проверить компилятор можно командой g++ --version. Если она выдаёт номер версии, а не «команда не найдена» — можно начинать.
Шаг 1. Объявляем массив
Массив в C++ — это блок из нескольких переменных одного типа, лежащих в памяти подряд. Объявляется он так: тип, имя, размер в квадратных скобках.
#include <iostream>
int main() {
// Массив на 5 целых чисел, пока не заполнен
int numbers[5];
std::cout << "Массив объявлен\n";
return 0;
}
Скомпилируйте и запустите: g++ arrays.cpp -o arrays && ./arrays. В консоли должна появиться строка «Массив объявлен». Значения элементов сейчас непредсказуемы — память просто выделена, но не заполнена.
Размер массива при таком объявлении должен быть известен на этапе компиляции. Написать int numbers[n], где n вводит пользователь, стандартный C++ не разрешает — для этого есть std::vector, о нём в конце.
Шаг 2. Заполняем значениями
Задать значения можно сразу при объявлении — в фигурных скобках.
int numbers[5] = {10, 20, 30, 40, 50};
Или обращаться к элементам по отдельности через индекс. Вот здесь ключевой момент: индексы начинаются с нуля. Первый элемент — numbers[0], последний в массиве из пяти элементов — numbers[4], а не numbers[5].
#include <iostream>
int main() {
int numbers[5];
numbers[0] = 10;
numbers[1] = 20;
numbers[2] = 30;
numbers[3] = 40;
numbers[4] = 50;
std::cout << "Первый элемент: " << numbers[0] << "\n";
std::cout << "Последний элемент: " << numbers[4] << "\n";
return 0;
}
После запуска увидите: «Первый элемент: 10» и «Последний элемент: 50». Если увидели именно это — заполнение работает.
Отсчёт с нуля — не прихоть. Индекс это смещение от начала массива в памяти. Первый элемент лежит в самом начале, его смещение равно нулю. Отсюда и numbers[0].
Шаг 3. Проходим массив циклом
Обращаться к каждому элементу вручную неудобно. Цикл for решает это: счётчик пробегает индексы от 0 до размера минус один.
#include <iostream>
int main() {
int numbers[5] = {10, 20, 30, 40, 50};
// i идёт от 0 до 4 включительно
for (int i = 0; i < 5; ++i) {
std::cout << "numbers[" << i << "] = " << numbers[i] << "\n";
}
return 0;
}
Обратите внимание на условие i < 5, а не i <= 5. При i == 5 обращение numbers[5] вышло бы за границу массива. В консоли должны появиться пять строк — от numbers[0] = 10 до numbers[4] = 50.
Range-based for: короче и безопаснее
Начиная с C++11, есть цикл, который сам проходит по элементам без индексов. Ошибиться с границей в нём невозможно.
for (int value : numbers) {
std::cout << value << "\n";
}
Здесь value на каждой итерации становится копией очередного элемента. Если нужно менять элементы прямо в массиве, берите ссылку: for (int& value : numbers).
Шаг 4. Считаем сумму и находим максимум
Соберём всё вместе — типичная задача, ради которой массивы и нужны.
#include <iostream>
int main() {
int numbers[5] = {10, 20, 30, 40, 50};
int sum = 0;
int max = numbers[0]; // стартуем с первого элемента
for (int i = 0; i < 5; ++i) {
sum += numbers[i];
if (numbers[i] > max) {
max = numbers[i];
}
}
std::cout << "Сумма: " << sum << "\n"; // 150
std::cout << "Максимум: " << max << "\n"; // 50
return 0;
}
Запустите — увидите «Сумма: 150» и «Максимум: 50». Заметьте: максимум инициализируется первым элементом, а не нулём. Если бы в массиве были отрицательные числа, старт с нуля дал бы неверный ответ.
Если не получилось
Разберём ошибки, которые встречаются почти у всех новичков.
- Программа падает или выдаёт мусор в конце цикла. Скорее всего, в условии
i <= 5вместоi < 5. Компилятор не запрещает выход за границу и не выдаёт ошибку — программа читает чужую память. Это одна из самых коварных ошибок в C++. - error: variable-length arrays are not supported (или
expression must have a constant valueв MSVC). Вы задали размер массива переменной. Либо сделайте размер константой (const int size = 5;), либо используйтеstd::vector. - Значения массива непредсказуемы. Вы объявили массив, но не заполнили его. Локальный массив без инициализации содержит мусор. Инициализируйте нулями:
int numbers[5] = {};. - error: 'numbers' was not declared in this scope. Опечатка в имени или вы обращаетесь к массиву за пределами функции, где он объявлен.
- warning: unused variable. Не ошибка, а предупреждение: вы объявили массив и не используете его. На работу программы не влияет.
Массив или std::vector — что выбрать дальше
Встроенный массив хорош для учёбы и случаев, где размер фиксирован и известен заранее. Но у него есть неудобства: он не знает своего размера, не умеет расти и легко выходит за границы без предупреждения. В реальном коде на C++ чаще берут std::vector из заголовка <vector>.
| Характеристика | Встроенный массив int a[5] | std::vector<int> |
|---|---|---|
| Размер задаётся переменной | Нет | Да |
| Может расти во время работы | Нет | Да, через push_back |
| Знает свой размер | Нет | Да, метод size() |
| Проверка границ | Нет | Есть у метода at() |
| Где уместен | Учёба, фиксированный размер | Почти везде в реальном коде |
Тот же массив на векторе выглядит так:
#include <iostream>
#include <vector>
int main() {
std::vector<int> numbers = {10, 20, 30, 40, 50};
numbers.push_back(60); // добавили шестой элемент
std::cout << "Размер: " << numbers.size() << "\n"; // 6
return 0;
}
Что делать дальше
Вы умеете объявлять массив, заполнять его, проходить циклом и считать по нему. Следующие шаги в порядке возрастания пользы: разберите std::vector целиком (методы at(), size(), push_back) — в реальных проектах он встречается на порядок чаще встроенного массива. Затем посмотрите std::array из <array> — это тот же фиксированный массив, но знающий свой размер. Многомерные массивы (int matrix[3][3]) — отдельная тема, к ней стоит переходить, когда одномерные уже не вызывают вопросов.
Разбор научной статьи: Сложный текст — понятным языком, с терминами
Спросить за 12 ₽Источники: Arrays — cppreference.com, std::vector — cppreference.com
Частые вопросы
Почему индексы начинаются с нуля, а не с единицы?
У меня GCC 9, а не 13 — код будет работать?
Программа не падает при выходе за границу массива — это нормально?
Можно задать размер массива переменной, которую ввёл пользователь?
Чем std::array отличается от обычного массива?
Материал носит информационный характер и подготовлен редакцией «Агентуры». Он не является офертой, рекламой или индивидуальной консультацией. Упомянутые продукты, компании и торговые знаки принадлежат их правообладателям. Перед принятием решений, влекущих юридические или финансовые последствия, обратитесь к профильному специалисту.