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

При решении многих задач (на самом деле почти всех задач прикладного характера) приходится прибегнуть к такому чудному типу данных как массив. Одномерные массивы довольно часто используются в решении задач программирования. Сегодня мы разберемся что такое одномерный массив. Также будет еще несколько статей, где мы подробно разберем некоторые задачи с применением одномерных массивов.

Для начала определим что такое массив? Сразу предостерегаю, что задача данной статьи - максимально доступно довести до читателя суть того, что есть массив и частный случай - одномерный массив. Вполне вероятно, что определения академически не верны и ваш профессор не примет их на зачете ;)

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

Элементы массива - данные одного типа. Это означает, что в массиве не могут храниться и число типа integer и строка одновременно. Именно поэтому при объявлении массива всегда указывается тип данных, который будет храниться в нем.

Элементы массива упорядочены. Это означает, что каждый элемент массива занимает определенную "позицию" внутри данного массива. Ему сопоставляется некий индекс - число, иначе - порядковый номер. Доступ к данному элементу можно получить, указав данный порядковый номер. В разных языках программирования порядок начинается с 0 или 1. В языке программирования C++, как и во всех C-подобных языках программирования, нумерация элементов массива идет начиная с 0.

Массив занимает вполне определенный объем памяти, который зависит от размера массива и типа данных. При этом не важно сколько данных введено в массив. В любом случае программа выделит данный объем памяти. Чтобы было. Может показаться, что это огромный недостаток массива, но как дальше мы убедимся, этот же недостаток является достоинством. Дело в том, что массив резервирует определенное количество блоков (ячеек) памяти подряд, линейно. Зарезервированную область памяти уже никто не сможет занять. Но и сам массив не сможет увеличить размер уже зарезервированной памяти. Так как участки памяти резервируются при запуске программы, а не при выполнении, то, в случае, если для массива, как и для других данных, не хватило памяти, то программа аварийно завершается. Есть и иной способ резервирования памяти под массив - это так называемые динамические массивы. В данном случае память выделяется во время выполнения программы и размер памяти зависит от сторонних факторов: ввод пользователя, получение пакета данных и т.п. В данном случае, при выходе зарезервированной памяти за область доступной, иначе - переполнении, может возникнуть большое количество ошибок, отличающихся от системы к системе.

Массив в C++ объявляется следующим образом:

тип_данных_элементов_массива имя_массива[размер_массива];

Допустим у нас 4 стула. Каждый стул имеет порядковый номер. У каждого стула определенное количество ножек. Для того, чтобы хранить информацию об этих стульях, нам достаточно создать массив, каждый элемент которого - это стул, а значение элемента - количество ножек стула. Для указания количества ножек нам достаточно переменной типа int. Всё же их должно быть цело число. Ниже представим данный массив.

int chear[4];

Ниже изобразим данный массив в виде таблицы для большего понимания того, о чем идет речь:

Индекс элемента массива 0 1 2 3
Количество ножек 4 3 4 6

Доступ к элементам массива можно получить следующим образом: допустим вам необходимо узнать сколько ножек у стула под номером 4? Из таблицы мы видим, а из прочитанного выше помним, что индексы элементов массива начинаются с 0, а не с 1. Соответственно индекс четвертого стула (элемента массива) равно 3, а индекс N-ного элемента массива равен N-1. Возможно вам пока не очень удобно представлять и запоминать данное, но оно сделано не просто ради того, чтобы калечить умы молодых программистов. Дело в том, что программа знает только адрес первого элемента и размер памяти, выделяемый под конкретный тип данных. Для нашего int это 4 байта. Для того, чтобы получить конкретный элемент, мы передаем индекс этого элемента, а программа возвращает содержимое, хранящееся в памяти по адресу от [АДРЕС_НУЛЕВОГО_ЭЛЕМЕНТА] * [ИНДЕКС_ЭЛЕМЕНТА] до [АДРЕС_НУЛЕВОГО_ЭЛЕМЕНТА] * [ИНДЕКС_ЭЛЕМЕНТА] + [РАЗМЕР_ПАМЯТИ_ДЛЯ_ЭТОГО_ТИПА_ДАННЫХ].

У массива есть понятие размерности. Размерность массива - это количество индексов, необходимое для однозначного доступа к элементу массива.

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

Объявление одномерных массивов

Одномерный массив в C++ объявляется указанием типа данных элементов массива, названия и длины массива. В ниже приведенном примере массив имеет длину в 10 элементов типа int. Имя массива num_array.

int num_array[10];

Определение (инициализация) одномерного массива

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

int num_array[10] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};

// Или заполним массив нулями
int num_array[10] = {0};

Также можно инициализировать массив после объявления. Тогда некоторые компиляторы при объявлении заполнят массив нулями. Это 0 - если тип данных числовой, или '\0' - если символьный.

int num_array[10];
num_array[0] = 0;
num_array[1] = 1;
num_array[2] = 2;
num_array[3] = 3;
num_array[4] = 4;
num_array[5] = 5;
num_array[6] = 6;
num_array[7] = 7;
num_array[8] = 8;
num_array[9] = 9;

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

Получить доступ к элементу одномерного массива можно, указав индекс элемента.

int a = num_array[8];
std::cout << 'a = ' << a << std::endl;
std::cout << 'num_array[8] = ' << num_array[8] << std::endl;
Результат выполнения
a = 8
num_array[8] = 8

Изменение значений элементов одномерного массива

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

num_array[9] = 124;
num_array[7] = num_array[5] + 9814;

Этой информации должно быть достаточно для понимания того, что такое массивы и в частности одномерные массивы и как с ними работать.