Массивы. Часть 1. Определение массива. Одномерные массивы. Инициализация массива

Массивы. Часть 1. Определение массива. Одномерные массивы. Инициализация массива


Содержание


1. Что такое массив? Определение массива

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

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

2. Определение одномерных и многомерных массивов.

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

3. Описание одномерного массива. Примеры описания одномерных массивов

Общая форма описания одномерного массива:

тип имя_массива[размер];

В вышеприведенном описании:

  • тип – это тип элементов массива. Он еще называется базовым типом. Базовый тип определяет количество данных каждого элемента, который составляет массив. Тип элементов массива может быть как базовым типом так и составным (например, структура). Подробно о базовых типах данных C++ описывается здесь.
  • размер – количество элементов в массиве;
  • имя_массива – непосредственно имя массива, по которому осуществляется доступ к элементам массива.

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

Пример 1. Описание массива из 10 целых чисел (тип int) с именем A.

int A[10];

В результате, в памяти компьютера выделяется 10 ячеек типа int. Если одна ячейка занимает 2 байта, то всего будет выделено 20 байт памяти. Номер первой ячейки начинается с нуля. Эти ячейки объединены общим именем A.

C++ массив целые числа

Рисунок 1. Массив из 10 целых чисел

Пример 2. Описание массива с именем M, содержащим 20 элементов типа char.

char M[20];

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

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

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

Пример 1. Пусть дан массив с именем A, содержащий 10 целых чисел. Записать число 5 в первый и последний элементы массива.

// описание массива A
int A[10];

A[0] = 5; // первый элемент массива
A[9] = 5; // последний элемент массива

На рисунке 2 видно результат работы вышеприведенного программного кода.

C++ массив запись числа

Рисунок 2. Результат работы фрагмента кода

Пример 2. Массив из 10 элементов типа char.

char M[10];

M[3] = 'a';
M[7] = '0';
M[8] = ';';

C++ массив символов char
Рисунок 3. Массив из 10 элементов типа char

Пример 3. Массив из 30 вещественных чисел.

double M[30]; // массив из 30 вещественных чисел

// обнуление массива M
for (int i=0; i<30; i++)
    M[i] = 0.0;

5. Как определить размер одномерного массива?

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

размер массива = размер типа в байтах × количество элементов

Пример.

Если в массиве 20 элементов типа double (8 байт), то размер массива будет

размер = 20 × 8 = 160 байт


6. Особенности обработки массивов компилятором в C++. Границы массива

В C++ не ведется строгого контроля за доступом к элементам за пределами массива. Если описать массив из 100 элементов, то можно прочитать или изменить 101-й, 102-й и следующие элементы. На этих позициях могут быть ячейки памяти, которые были выделены для других переменных или даже для вашей программы. Это может привести к уничтожению программы при отсутствии каких-нибудь замечаний со стороны компилятора C++.

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

Такое поведение компилятора C++ можно объяснить по следующим причинам. Язык C++ предназначен для профессионалов. Задача языка – дать возможность профессиональным программистам создавать максимально эффективный код. Если в компилятор C++ включить код проверки, то это существенно замедлит выполнение программы и код не будет максимально эффективным.

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

7. Как осуществляется инициализация массива в C++. Примеры

В C++ поддерживается два вида инициализации массивов:

  • инициализация с заданием размера массива;
  • «безразмерная» инициализация.

Общий вид инициализации с заданием размера массива:

тип имя_массива[размер] = { список_значений };

где

  • тип – тип элементов массива;
  • размер – количество элементов массива указанного типа;
  • список_значений – список значений инициализации элементов массива. Элементы массива разделяются символом ‘ , ‘ (запятая).

Общий вид «безразмерной» инициализации:

тип имя_массива[] = { список_значений };

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

Пример 1. Массив B инициализирован с заданием размера.

// инициализация массива B
int B[10] = { 5, 6, 9, -8, 3, 2, 4, -90, -103, 0 };

Пример 2. Массив C инициализирован на основе списка значений («безразмерная» инициализация).

// инициализация массива C без задания размера
float C[] = { -3.9, 2.8, -1.6, 2.2 };

8. Инициализация символьных массивов. Пример

Для символьных массивов можно использовать сокращенный вариант инициализации:

char имя_массива[размер] = "строка";

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

Допускается также вариант инициализации массива без указания размера

char имя_массива[] = "строка";

В этом случае размер массива равен длине строки.

Пример. Инициализация символьного массива с именем str.

// символьный массив - сокращенный вариант инициализации
char str[] = "Hello!";

// другой вариант инициализации символьного массива
char str2[] = { 'H', 'e', 'l', 'l', 'o', '!' };

В вышеприведенном примере массивы str и str2 содержат одинаковые значения.

9. Присвоение одного массива другому. Пример

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

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

// описание массивов A и B
int A[10], B[10];
int i;

//A = B; // ошибка!

for (i=0; i<10; i++)
    B[i] = 0;

for (i=0; i<10; i++)
    A[i] = B[i];

10. Описание массива структур. Пример

Пусть дано описание структуры, которая содержит информацию о книге:

struct BOOK
{
    char title[50];
    char author[50];
    int year;
    float price;
};

Это описание определяет новый тип struct BOOK. При таком описании память не выделяется. Это только информация о новом типе данных. Структура должна быть описана за пределами определения любого класса в начале определения пространства имен.

В программе массив из 5 книг (структур) можно описать так:

struct BOOK Books[5];

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

strcpy(Books[0].title, "Title-1");
strcpy(Books[0].author, "Author-1");
Books[0].year = 1970;
Books[0].price = 28.85;

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

strcpy(str1, str2);

Эта функция копирует строку str2 в строку str1. Чтобы использовать эту и другие функции работы со строками в начале программы (перед описанием пространства имен) нужно указать строку

#include <cstring>

или

#include <string.h>


Связанные темы