[БЕЗ_ЗВУКА] Теперь давайте продемонстрируем с помощью того же приёма, что мы использовали в блоке про модели памяти, что данные массива хранятся на стеке. Для этого мы в первую очередь отключим оптимизации, которые мы включили только что, возвращаемся в настройки проекта и заменяем −О2 на −О0, чтобы мы могли нормально проитерироваться по стеку. А теперь давайте заведём локальную переменную x со значением 111111, локальную переменную y со значением 222222, а между ними объявим массив из десяти int-ов. Называем его numbers и заполняем его, например, восьмёрками. А теперь я проитерируюсь указателем p от переменной y до переменной x включительно, выводя все как будто бы int-ы, которые нам по пути попадаются. А в конце выведу перевод строки. Итак, код компилируется. [БЕЗ_ЗВУКА] Он компилируется чуть дольше, потому что я отключил оптимизации. И сейчас я ожидаю увидеть, что у меня сначала будет переменная y из шести двоек. Да, так и есть. Затем у меня идёт десять восьмёрок. Затем некоторая служебная информация и переменная x из шести единиц. То есть действительно всё лежит на стеке, всё лежит во фрейме функции. Хорошо. Что ещё можно сказать про массив? Важно сказать, что компилятору действительно нужно знать совершенно точно, каким будет размер этого массива. Даже так: массив из десяти int-ов, и массив из девяти int-ов — это разные типы, они не совместимы друг с другом. И вы не сможете сюда вместо 10 поставить какую-то переменную, значение которой компилятору заранее не известно. Можем попробовать, в принципе, но, конечно, у нас ничего не получится. Давайте я сюда поставлю переменную n, а перед этим напишу int n =... Даже не так, я считаю со ввода переменную n. И у меня ничего не компилируется, я считал неправильно. Вот. Теперь я поправился. И сейчас я получу правильную ошибку компиляции. Вот теперь компилятор говорит то, что мы и ожидали, что значение переменной n нельзя использовать в константном выражении. Вот здесь компилятор ожидал некоторую константу увидеть, так что давайте вернём 10 и не будем его огорчать. Кроме того, что ещё хочется сказать. Если вы вдруг знакомы с массивами из языка С, когда мы там пишем просто int, название, квадратные скобки и количество элементов. Вот array из С++ гораздо приятнее. Он приятнее тем, что у него есть конструктор копирования. В языке С вы не могли просто взять и скопировать обычный массив. В array вы можете это сделать. А именно, имея переменную numbers, мы можем взять и создать в переменную numbers_copy, проинициализировав её массивом numbers. Давайте попробуем. Компилятор огорчается, неиспользуемая переменная numbers_copy, но зато у нас на стеке видно десять восьмёрок, потом ещё что-то, потом ещё десять восьмёрок. И вот все наши переменные, y, и x, и ещё какая-то служебная информация. То есть действительно всё хорошо. Ну и давайте я, наконец, уберу этот странный цикл, покажу, что по массиву можно проитерироваться обычным циклом for. Беру и итерируюсь по numbers_copy, выводя x-ы. И сейчас я ожидаю увидеть десять восьмёрок, полученных с помощью обычного цикла for. Да. Всё отлично. Итак, мы познакомились с контейнером массив, который хранит свои данные на стеке. И у него тоже есть своя ниша. А именно, если нам нужно слишком часто создавать массив из известного заранее небольшого количества элементов, то вот здесь эффективнее использовать массив, нежели вектор или какие-то другие контейнеры, выделяющие память в кучу.