Урок №74. Массивы

  Юрий  | 

    | 

  Обновл. 2 мая 2019  | 

 24069

 ǀ   14 

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

Что такое массив?

К счастью, структуры не являются единственным агрегированным типом данных в C++. Есть ещё массив — совокупный тип данных, который позволяет получить доступ ко всем переменным одного и того же типа данных через использование одного идентификатора.

Рассмотрим случай, когда нужно записать результаты тестов 30 студентов в классе. Без использования массива нам придётся выделить почти 30 одинаковых переменных!

С использованием массива всё гораздо проще. Следующая строчка эквивалентна коду выше:

В объявлении переменной массива мы используем квадратные скобки [], чтобы сообщить компилятору, что это переменная массива (а не обычная переменная), а в скобках — количество выделяемых элементов (это называется длиной или размером массива).

В примере выше мы объявили фиксированный массив с именем testResult и длиной 30. Фиксированный массив (или ещё «массив фиксированной длины») представляет собой массив, размер которого известен во время компиляции. При создании testResult, компилятор выделит 30 целочисленных переменных.

Элементы массива


Каждая из переменных в массиве называется элементом. Элементы не имеют своих собственных уникальных имён. Вместо этого для доступа к ним используется имя массива вместе с оператором индекса [] и параметром, который называется индексом, и который сообщает компилятору, какой элемент мы хотим выбрать. Этот процесс называется индексированием массива.

В примере выше первым элементом в нашем массиве является testResult[0], второй — testResult[1], десятый — testResult[9], последний — testResult[29]. Хорошо, что уже не нужно отслеживать и помнить кучу разных (хоть и похожих) имён переменных — для доступа к разным элементам нужно изменить только индекс.

Важно: В отличие от повседневной жизни, отсчёт в программировании и в С++ всегда начинается с 0, а не с 1!

Для массива длиной N элементы массива будут пронумерованы от 0 до N-1! Это называется диапазоном массива.

Пример программы с использованием массива

Здесь мы можем наблюдать как определение, так и индексирование массива:

Результат выполнения программы выше:

The lowest number is 3
The sum of the first 5 numbers is 29

Типы данных и массивы


Массив может быть любого типа данных. Например, объявляем массив типа double:

Результат выполнения программы выше:

The average is 3.1

Массивы также можно сделать из структур. Например:

Чтобы получить доступ к члену структуры из элемента массива, сначала нужно выбрать элемент массива, затем использовать оператор выбора члена структуры, а затем требуемый член структуры:

Индексы массивов

В C++ индексы массивов всегда должны быть интегрального типа данных (char, short, int, long, long long, bool и т.д.). Эти индексы могут быть либо константными значениями, либо неконстантными значениями. Например:

Объявление массивов фиксированного размера


При объявлении массива фиксированного размера, его длина (между квадратными скобками) должна быть константой типа compile-time (которая определяется во время компиляции). Вот несколько разных способов объявления массивов с фиксированным размером:

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

Чуть-чуть о динамических массивах

Поскольку массивам фиксированного размера память выделяется во время компиляции, то здесь мы имеем два ограничения:

   Массивы фиксированного размера не могут иметь длину, основанную на любом пользовательском вводе или другом значении, которое вычисляется во время выполнения программы (runtime).

   Фиксированные массивы имеют фиксированную длину, которую нельзя изменить.

Во многих случаях эти ограничения являются проблематичными. К счастью, C++ поддерживает ещё один тип массивов, известный как динамический массив. Размер такого массива может быть установлен ​​во время выполнения программы и его можно изменить. Однако создание динамических массивов несколько сложнее фиксированных, поэтому мы поговорим об этом несколько позже в этой главе.

Заключение

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

В следующем уроке мы рассмотрим больше тем связанных с фиксированными массивами.

Оценить статью:

Звёзд: 1Звёзд: 2Звёзд: 3Звёзд: 4Звёзд: 5 (136 оценок, среднее: 4,79 из 5)
Загрузка...

Комментариев: 14

  1. Аватар Алексей:

    Изучаю и UE4, там массивы вообще не рекомендуют использовать)
    Хотя недавно делал инициализацию структуры при случаи, это был выбор сложности для Hi-Lo.

    С массивами немного легче, хотя кто знает)

  2. Аватар Владислав:

    Всем здравствуйте! Друзья может кто помочь с решением такой задачи. Знаю что базовое задание, но в программировании не силен, но решить нужно.
    Задание: Массив A = (15, 9, –6, 12, –9, 18, 0) преобразован к виду A = (5, 3, 0, 4, 0, 6, 0). Размер массива A — 20 элементов из диапазона [–25,25]. Вычислить сумму четных элементов преобразованного массива.
    Вот что то попробовал но не уверен что работает правильно.

  3. Аватар SuRprizZe:

    Почему элементу массива которого как бы не существует,если вначале объявляется элемент с 4 значениями,можно 5 элементу присвоить что-то хотя его нет и как вообще это объяснить?!

    1. Аватар Роман:

      Как я понимаю, объявляя массив Array[n], мы резервируем n-ое количество элементов памяти соответствующего типу данных размера, а Array[i] — это указатель на i-ый элемент памяти такого размера, начиная с нулевого (Array[0]). Следовательно, если мы напишем "Array[n]=чему-то", мы обратимся к элементу памяти, следующему за местом хранения последнего члена массива (Array[n-1]), — куда и будет помещено наше "что-то" и будет до поры до времени там спокойно лежать. Программу такая "просьба" ни капли не затруднит.
      Однако, поскольку мы договорились с программой, что хранит она наш массив только в n элементах, то, как только ей понадобится ближайшая к массиву ячейка памяти, программа немедленно, без зазрения совести, выбросит наше "что-то" в забвение и мы уже никогда, никогда его не найдем…
      К слову, тут, мне кажется, может быть еще хуже: программа зарезервирует кусок памяти, идущий вслед за массивом, под некую нашу переменную x, со значением, скажем Y — а мы возьми и помести туда наш n+1-ый элемент!.. И будет, обратно, он там лежать, покуда иксу не присвоят новое значение. Или программа вовсе уйдет в глюк.

  4. Аватар alien:

    Почему вы используете std::
    Если вместо этого можно написать
    using namespace std; ??
    Думаю лучше добавить эту библиотеку и не писать каждый раз std::
    просто небольшой совет 😉

    1. Юрий Юрий:

      Читайте уроки 24 и 54.

    2. Аватар Александр:

      С ростом объемов кода этот "небольшой совет" превращается в "большую проблему"… А при попытке отладки этого кода может перерасти вообще в "катастрофу" :)))

  5. Аватар Александр:

    Вот тоже всегда считал и всем рассказывал, что размер массива должен задаваться константой compile time, а недавно в техностриме mail.ru (или яндекса) услышал, что в текущем стандарте (то ли с С++14, то ли с С++17) можно и переменными задавать и это считается корректным… причем считается это лучшей идеей, чем выделять динамический массив, вроде как потому, что он самоубивается корректно…

    Хотя мне все равно кажется, что "безопасней" работать с константными размерами

  6. Аватар Игорь:

    Почему в конце инициализируется значением 8 массив с индексом 4. (array[index] = 8). ведь последний индекс у этого массива 3 (array[3] )?

    1. Аватар ffolax:

      Ошибка допущена. Значение будет записано в ячейку следующую за последним элементом массива. Место под ту ячейку не зарезервировано массивом и может в любой момент быть изменено другим процессом.

    2. Аватар SuRprizZe:

      Тут общее количество элементов в массиве , считая с 1

  7. Аватар Oleksiy:

    Пример программы с использованием массива…

    "The lowest number is: " << array[0]

    самое маленькое число находится в array[1]

  8. Аватар KiFoR:

    О Даэдра… Как же я ненавижу массивыы…

    1. Юрий Юрий:

      Увы, но от этого ничего не поменяется 🙂

Добавить комментарий

Ваш E-mail не будет опубликован. Обязательные поля помечены *