Массивы

Массив — это нумерованный набор переменных одного типа. Переменная в массиве называется элементом, а ее позиция в массиве задается индексом. Объем памяти (в байтах), занимаемый массивом, определяется так:

<Объем памяти> = sizeof (<Тип>) * <Количество элементов>

Объявление массива выглядит следующим образом:

<Тип> <Переменная>[<Количество элементов>];

Пример объявления массива из трех элементов, имеющих тип long int:

long arr[3];

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

long arr[3] = {10, 20, 30};

Количество значений внутри фигурных скобок может быть меньше количества элементов массива. В этом случае значения присваиваются соответствующим элементам с начала массива. Пример:

long arr[3] = {10, 20};
for (int i = 0; i < 3; ++i) {
   std::cout << arr[i] << ' ';
} // 10 20 0

В этом примере первому элементу массива присваивается значение 10, второму — значение 20, а третьему элементу будет присвоено значение 0.

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

long arr[] = {10, 20, 30};
for (int i = 0; i < 3; ++i) {
   std::cout << arr[i] << ' ';
} // 10 20 30

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

  • элементам глобальных массивов автоматически присваивается значение 0;
  • элементы локальных массивов будут содержать произвольные значения, так называемый «мусор».

Обращение к элементам массива осуществляется с помощью квадратных скобок, в которых указывается индекс элемента. Обратите внимание на то, что нумерация элементов массива начинается с 0, а не с 1, поэтому первый элемент имеет индекс 0. С помощью индексов можно присвоить начальные значения элементам массива уже после объявления:

long arr[3];
arr[0] = 10; // Первый элемент имеет индекс 0!!!
arr[1] = 20; // Второй элемент
arr[2] = 30; // Третий элемент

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

Все элементы массива располагаются в смежных ячейках памяти. Например, если объявлен массив из трех элементов, имеющих тип int (занимает 4 байта), то адреса соседних элементов будут отличаться на 4 байта:

int arr[3] = {10, 20, 30};
for (int i = 0; i < 3; ++i) {
   std::printf("%p\n", &arr[i]);
}

Результат в проекте Test64:

000000000023fe40
000000000023fe44
000000000023fe48

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

long arr[3] = {10, 20, 30};
long x = 0;
x = arr[1] + 12;
arr[2] = x - arr[2];
std::cout << x << std::endl;      // 32
std::cout << arr[2] << std::endl; // 2

Массивы в языке C++ могут быть многомерными. Объявление многомерного массива имеет следующий формат:

<Тип> <Переменная>[<Количество элементов1>]...[<Количество элементовN>];

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

<Тип> <Переменная>[<Количество строк>][<Количество столбцов>];

Пример объявления двумерного массива, содержащего две строки и четыре столбца:

int arr[2][4]; // Две строки из 4-х элементов каждая

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

int arr[2][4] = {
   1, 2, 3, 4,
   5, 6, 7, 8
};

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

int arr[2][4] = {
   {1, 2, 3, 4},
   {5, 6, 7, 8}
};
for (int i = 0, j = 0; i < 2; ++i) {
   for (j = 0; j < 4; ++j) {
      std::cout << arr[i][j] << ' ';
   }
   std::cout << std::endl;
}

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

1 2 3 4 
5 6 7 8 

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

int arr[][4] = {
   {1, 2, 3, 4},
   {5, 6, 7, 8}
};

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

int arr[2][4] = {
   {1, 2, 3, 4},
   {5, 6, 7, 8}
};
std::cout << arr[0][0] << std::endl; // 1
std::cout << arr[1][0] << std::endl; // 5
std::cout << arr[1][3] << std::endl; // 8

Учебник C++ (MinGW-W64)
Учебник C++ (MinGW-W64) в формате PDF

Помощь сайту

ЮMoney (Yandex-деньги): 410011140483022

ПАО Сбербанк:
Счет: 40817810855006152256
Реквизиты банка:
Наименование: СЕВЕРО-ЗАПАДНЫЙ БАНК ПАО СБЕРБАНК
Корреспондентский счет: 30101810500000000653
БИК: 044030653
КПП: 784243001
ОКПО: 09171401
ОКОНХ: 96130
Скриншот реквизитов