Как сделать массив в c

Добавил пользователь Евгений Кузнецов
Обновлено: 10.09.2024

В этом уроке мы научимся работать с массивами. Мы научимся объявлять, инициализировать и получать доступ к элементам массива в программировании на C++ с помощью примеров. В С++ массив – это переменная, которая может хранить несколько значений одного типа.

Например: Предположим, в классе 27 учеников, и нам нужно сохранить оценки всех их. Вместо того, чтобы создавать 27 отдельных переменных, мы можем просто создать массив:

Здесь grade – это массив, который может содержать не более 27 элементов типа double.

В C++ размер и тип массивов не могут быть изменены после его объявления.

Объявление массива

  • int – тип сохраняемого элемента;
  • x – имя массива;
  • 6 – размер массива.

Доступ к элементам в массиве

В C++ каждый элемент массива связан с числом. Число известно, как индекс массива. Мы можем получить доступ к элементам массива, используя эти индексы.

Рассмотрим массив x, который мы видели выше.

Доступ к элементам в массиве

Несколько вещей, которые следует помнить:

  • Индексы массива начинаются с 0. Это означает, что x [0] – это первый элемент, сохраненный с индексом 0.
  • Если размер массива равен n, последний элемент сохраняется по индексу (n-1). В этом примере x [5] – последний элемент.
  • Элементы массива имеют последовательные адреса. Например, предположим, что начальный адрес x [0] – 2120d. Тогда адрес следующего элемента x [1] будет 2124d, адрес x [2] будет 2128d и так далее. Здесь размер каждого элемента увеличивается на 4. Это потому, что размер int равен 4 байтам.

Инициализация

В С++ можно инициализировать массив во время объявления. Например:

Инициализация массива

Другой способ инициализации массива при объявлении:

Здесь мы не упомянули размер массива. В таких случаях компилятор автоматически вычисляет размер.

Массив с пустыми членами

В C++, если массив имеет размер n, мы можем хранить до n элементов в массиве. Однако что произойдет, если мы сохраним менее n элементов.

Здесь массив x имеет размер 6. Однако мы инициализировали его всего тремя элементами.

В таких случаях компилятор присваивает оставшимся местам случайные значения. Часто это случайное значение просто 0.

Массив с пустыми членами

Как вставить и распечатать элементы массива?

Пример 1: отображение элементов

Здесь мы использовали цикл for для итерации от i = 0 до i = 4. На каждой итерации мы выводили числа [i].

Мы снова использовали цикл for на основе диапазона для вывода элементов массива.

Примечание. В нашем цикле на основе диапазона мы использовали код const int n вместо int n в качестве объявления диапазона. Однако более предпочтительным является const int n, потому что:

  1. Использование int n просто копирует элементы массива в переменную n во время каждой итерации. Это неэффективно с точки зрения памяти. n , однако, использует адрес памяти элементов массива для доступа к их данным, не копируя их в новую переменную. Это эффективно с точки зрения памяти.
  2. Мы просто печатаем элементы массива, а не изменяем их. Поэтому мы используем const, чтобы случайно не изменить значения массива.

Пример 2: получение входных данных от пользователя и сохранение их в массиве

И снова мы использовали цикл for для итерации от i = 0 до i = 4. На каждой итерации мы брали ввод от пользователя и сохраняли его в числах [i].

Затем мы использовали другой цикл for для печати всех элементов массива.

Пример 3: отображение суммы и среднего значений элементов, используемых для цикла

В этой программе:

  1. Мы инициализировали двойной массив с именем numbers, но не указали его размер. Мы также объявили три двойных переменных sum , count и average . Здесь sum = 0 и count = 0.
  2. Затем мы использовали цикл for на основе диапазона для печати элементов массива. На каждой итерации цикла мы добавляем текущий элемент массива к sum .
  3. Мы также увеличиваем значение count на 1 на каждой итерации, чтобы мы могли получить размер массива к концу цикла for.
  4. После печати всех элементов мы печатаем сумму и среднее всех чисел. Среднее значение чисел определяется как среднее значение = сумма/количество.

Примечание: мы использовали ранжированный цикл for вместо обычного цикла for.

Обычный цикл for требует, чтобы мы указали количество итераций, которое задается размером массива. Но для цикла с ранжированием такие спецификации не требуются.

Если мы объявим массив размером 10, то массив будет содержать элементы с индекса 0 до 9.

Однако, если мы попытаемся получить доступ к элементу с индексом 10 или более 10, это приведет к неопределенному поведению.

Пожалуйста, приостановите работу AdBlock на этом сайте.

Массив – это простейший составной тип данных. Когда мы обсуждали переменные, у нас была хорошая аналогия с коробкой. Вернёмся к ней. Если переменная – это один ящик, то массив – это несколько пронумерованных одинаковых ящиков, которые имеют одно и то же имя, а различаются между собой только порядковым номером.

Переменные и массивы. Аналогия с коробками.

Рис.1 Переменные и массивы. Аналогия с коробками.

На картинке выше изображено три массива:

  • целочисленный массив из 8 элементов с именем arr_int
  • вещественный массив из 11 элементов с именем arr_float
  • символьный массив из 6 элементов с именем arr_char

У массива, как и у переменной, имеются свои имя и тип данных. Кроме того, у массива ещё есть одна дополнительная характеристика – размер массива. Размер массива – количество элементов, которые могут в нём храниться. В нашей аналогии с коробочками это количество коробок.

Нумерация элементов массива начинается с нуля, а не с единицы.

Объявление и инициализация массива

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

На имя массива накладываются ограничения, аналогичные тем, которые накладываются на имя переменной.

Правило именования массивов

Вот ещё несколько примеров объявления массивов:

Массиву, как и любой переменной, можно присвоить начальные значения при объявлении. Если элементам массива не присвоить никакого значения, то в них будет храниться мусор, как и в обычных переменных.

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

Работа с отдельными элементами массива

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

Давайте, например, выведем элементы массива из пяти элементов на экран.

Конечно, если массив будет очень большой, то выводить его поэлементно подобным образом то ещё удовольствие. Да и с маленькими массивами так никто не делает. Лучше и правильнее использовать циклы. Например:

Программа в первом цикле сохраняет в массив первую сотню чётных чисел, а во втором цикле выводит их на экран.

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

Обратите внимание на приём, который используется в этой программе.
В нулевом элементе массива хранится количество выпадений числа 0 , в первом элементе – количество выпадений числа 1 , во втором элементе – числа 2 . То есть само сгенерированное число позволяет определить, к какому элементу массива необходимо добавить единичку. Поэтому необходимость в операторе выбора switch отпадает. Удобно, не так ли?

Практика

Решите предложенные задачи:


Для удобства работы сразу переходите в полноэкранный режим

Содержание статьи:

Массив — структура данных, содержащая ряд значений одинакового типа, расположенных последовательно, и обозначенная при помощи специального синтаксиса. Проще говоря, это набор однотипных значений хранящихся в последовательно расположенных ячейках памяти. Это полезная вещь избавила разработчиков от необходимости создавать тысячи переменных для каждого отдельно взятого значения. Вместо этого, с появлением такой структуры, мы просто делаем объявление переменной массива и добавляем туда поля одного типа данных, группируя их по определенному признаку. Уже оттуда можно получить доступ к конкретному элементу используя его порядковый номер (индекс).

Из основных преимущества массивов можно выделить: доступность значений хранящихся в различных ячейках памяти и более простое манипулирование данными (сортировка, перемещение и другие операции). Недостатки массива — ограничение его размера и условие однотипности (гомогенности) хранимых данных.

  • Одномерный массив. Содержит только одну строку данных, поэтому к элементу, хранящемуся в массиве, довольно просто получить доступ с помощью одного числового индекса, ( 0, 1, 2 и т. д.)
  • Многомерный массив. Содержит более одной строки с данными, поэтому его индекс будет состоять из пары чисел, одно из которых идентифицирует строку, а другое — столбец. Такой массив часто называют прямоугольным, так как он принимает форму прямоугольника, если представить его схематично.
  • Зубчатый массив. Это массив, состоящий из подмассивов(причем эти подмассивы могут быть любого размера).

тип данных [] имя массива ;


Как и во многих других языках программирования, в этом примере массив объявлен, но не создан. Для того чтобы создать экземпляр массива используется ключевое слово new .

Следуюший шаг — инициализируем наш массив.

Инициализация — это процедура присваивания значений свободным ячейкам массива. Информация может присваиваться поэлементно, как в последнем действии предыдущего примера:


Теперь попытаемся вывести в консоль значения элементов массива:


Этот код распечатает следующие значения :

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

В этом случае компилятор сначало посчитает количество переменных, потом определит тип, выделит необходимое количество ячеек в области оперативной памяти и проинициализирует их необходимыми значениями. При объявлении массива через new , все элементы инициализируются автоматически:

  • нулями — для цельночислового типа;
  • false — для логического;
  • null — для ссылок.

Неявная типизация массива

Определение массива объектов

Длина массива

В этом примере рассматриваемое свойство используется для ссылки на последний элемент в массиве:

Доступ к элементам массива.

Как мы уже упоминали ранее, для доступа к элементу массива нужно воспользоваться его порядковым номером (индексом). Например:

Не забываем, что нумерация элементов массива начинается с нуля, поэтому индекс 1-ого элемента будет 0, а четвертого — 3 ( digits[3] ). Мы изначально задали , что наш массив состоит из 4 элементов, поэтому, если обратиться, например, к шестому элементу digits[5] = 5 — получим в результате исключение IndexOutOfRangeException .

Передача массива в метод

Стандартная форма, при которой одномерный массив передается в метод выглядит так:

  • public – модификатор доступа;
  • return_type – тип, который вернул нам метод;
  • MethodName – имя метода;
  • type – тип массива, переданного в метод;
  • parameterName – название массива, являющегося одним из параметров нашего метода.

В следующем примере мы передаем массив в метод PrintArray .

Теперь все это можно соединить вместе, как показано в следующем примере:

Многомерные массивы

В многомерном массиве каждый элемент также является массивом. Например:

Двумерный массив можно представить в виде таблицы с определенным количеством строк и столбцов.


Подмассивы и являются элементами нашего двумерного массива.

int[ , ] i= new int [2, 3];

Здесь i — это двумерный массив состоящий из двух элементов, а каждый элемент представляет собой вложенный массив из 3 элементов. Если посчитать, всего в таком массиве можно хранить 6 элементов.

Примечание: Единственная запятая в этом коде [,] означает, что массив является двумерным.

Еще мы можем указать количество строк и столбцов во время инициализации. Например:

Для доступа к элементам рассматриваемого нами массива — используем индексы. Например:


Пример 2D-массива:

В приведенном выше примере мы создали 2D-массив с элементами и .

и использовали номера индексов для доступа к элементам:

  • digits[0, 0] — доступ к первому элементу из первой строки ( 2 )
  • digits[1, 0] — доступ к первому элементу из второго ряда ( 4 )

Зубчатые массивы

Здесь у нас массив digits содержащий в себе три подмассива. Причем размерность каждого из них не совпадает, схематично образуя своеобразные зубья, за счет разной длины.

В качестве подмассивов в нем можно использовать даже многомерные массивы:


Перебор массивов (foreach)

При помощи цикла foreach мы можем перебирать элементы в любом контейнере, в том числе и в массиве. Синтаксис для его объявления такой:

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

Класс System.Array

Кроме рассмотренных, данный класс содержит около двух десятков полезных статических методов и свойств.

Резюмируем:

Что такое массивы / Одномерный массив

C ++ предоставляет структуру данных, массив , в котором хранится последовательный набор фиксированного размера элементов того же типа. Массив используется для хранения коллекции данных, но часто бывает полезно придумать массив как набор переменных того же типа.

Вместо объявления отдельных переменных, таких как number0, number1, . и number99, вы объявляете одну переменную массива, такую как числа, и используете числа [0], числа [1] и . числа [99] для представления отдельные переменные. К конкретному элементу массива обращается индекс.

Все массивы состоят из смежных областей памяти. Нижний адрес соответствует первому элементу и наивысшему адресу последнего элемента.

Объявление массивов

Чтобы объявить массив в C ++, программист задает тип элементов и количество элементов, требуемых массивом, следующим образом:

Это называется одноразмерным массивом. ArraySize должен быть целое число константы больше нуля и типа может быть любым допустимым С ++ типом данных. Например, чтобы объявить 10-элементный массив, называемый балансом типа double, используйте этот оператор -

Инициализация массивов

Вы можете инициализировать элементы массива C ++ либо по одному, либо используя один оператор следующим образом:

Количество значений между фигурными скобками <> не может быть больше числа элементов, которые мы объявляем для массива между квадратными скобками []. Ниже приведен пример назначения одного элемента массива -

Если вы опустите размер массива, будет создан массив, достаточно большой для хранения инициализации. Поэтому, если вы пишете -

Вы создадите точно такой же массив, как в предыдущем примере.

Доступ к элементам массива

Доступ к элементу осуществляется путем индексации имени массива. Это делается путем размещения индекса элемента в квадратных скобках после имени массива. Например,

Вышеприведенный оператор будет принимать 10- й элемент из массива и присваивать значение переменной зарплаты. Ниже приведен пример, который будет использовать все вышеупомянутые три концепции, а именно: объявление, назначение и доступ к массивам -

Эта программа использует функцию setw() для форматирования вывода. Когда приведенный выше код компилируется и выполняется, он производит следующий результат:

Массивы в C ++

Массивы важны для C ++ и требуют много деталей. Существует несколько важных понятий, которые должны быть понятны программисту на C ++ -

Многомерные массивы

C ++ поддерживает многомерные массивы. Простейшей формой многомерного массива является двумерный массив.

Указатель на массив

Вы можете сгенерировать указатель на первый элемент массива, просто указав имя массива без индекса.

Передача массивов в функции

Вы можете передать функции указателю на массив, указав имя массива без индекса.

Массив – именованная структура данных, фиксированного размера, которая позволяет хранить, последовательность однотипных элементов, к которым можно обращаться с помощью индекса.

  • одномерные;
  • ступенчатые или зубчатые;
  • многомерные.

Одномерные массивы

Одномерный, или линейный массив – это конструкция фиксированной длины из набора элементов наперед заданного типа, доступ к которым осуществляется с использование одного индекса. Его можно рассматривать как вектор:

1 2 3 4 5 6 7 8 9 10

Синтаксис объявления массива, похожий на создание переменной, только после типа указываются квадратные скобки:

Пример объявления целочисленного массива:

Для создания массива используется следующий синтаксис:

Присвоим, предварительно созданной, переменной массив из десяти элементов:

При этом все элементы массива будут иметь тип int и значения по умолчанию для этого типа данных - 0.

В первых трех вариантах, можно использовать var вместо int[].

Для доступа к элементам массива, используются индексы, при этом начальный индекс равен нулю, соответственно последний индекс на единицу меньше длины массива.

Длину одномерного массива, можно получить из поля Length.

Обычно для работы с массивами, используются циклы. Рассмотрим пример заполнения и вывода, на экран консоли, данных массива:

Рассмотрим ситуацию, когда нужно скопировать данные одного целочисленного массива в другой.
В случае с переменными примитивных типов данных, мы могли записать копирование следующим образом:

Если применить эту логику работы к массивам, то получим:

Во второй строке кода, мы присваиваем переменной b ссылку на те самые данные, на которые указывает переменная a, то есть по факту у нас есть один набор элементов, а на него ссылаются две переменные. Если не учитывать этот факт, то в итоге мы получим ошибки в данных, которые иногда трудно отследить.

Для создания физической копии массива, можно воспользоваться следующим синтаксисом:

Кроме этого класс Array предоставляет нам возможность создать копию массива, вызовом метода Copy:

Ступенчатый массив

Тип данных массива может быть любым, по этому мы можем создать массив массивов, разной размерности, именно такая структура носит название – ступенчатый или зубчатый массив.

Для создания ступенчатого массива используется такой синтаксис:

Он имеет следующий вид:

1 2 3 4
1 2 3 4 5
1 2 3 4 5 6 7 8

Для обращения к элементу, используются два индекса:

Используя вложенные циклы, можно осуществлять обход всех элементов зубчатого массива:

Многомерные массивы

Для многомерных массивов характерным есть ранг(rank), или количество измерений. Двумерный массив – это таблица, трехмерный – куб…

Поскольку на практике мало используются массивы размерностью больше двух, дальше мы будем рассматривать только двухмерные массивы.

Создание двумерного массива можно записать следующим образом(все варианты равнозначны)::

В первых трех вариантах, вместо int[,] можно использовать var.

Каждый из созданных двумерных массивов имеет вид:

1 2 3
4 5 6
7 8 9

Доступ к элементам осуществляется посредством двух индексов:

Цикл foreach может обходить все элементы двумерного массива, а использование других циклов немного усложняется, из за того, что поле Length содержит в себе общую длину массива.

Для получения количества строк и столбцов, используют метод GetUpperBound, который возвращает значение последнего индекса, для переданного в качестве аргумента, измерения. Поскольку как результат мы получаем индекс, для получения длину, значение нужно увеличить на единицу:

  • Количество строк – GetUpperBound(0) + 1;
  • Количество столбцов – GetUpperBound(1) + 1.

Рассмотрим пример заполнения и вывода значений двумерного массива:

Как видим, цикл foreach выводит все элементы двумерного массива.

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

Итоги

К основным характеристикам массивов относятся:

  • Размерность или ранг – количество индексов, с помощью которых обращаются к элементу(одномерные, двумерные, трехмерные…);
  • Размер или длина массива – общее количество элементов в массиве;
  • Размерность каждого измерения – длина отдельно взятого измерения массива(для двухмерного – количество строк и столбцов).

В большинстве случаев используются одномерные и двумерные массивы. Переменная массива, не зависимо от типа данных её элементов, имеет ссылочный тип, помните это при работе с массивами.

Читайте также: