Массив (array) представляет собой набор объектов одинакового типа, имеющих общее имя. Доступ к конкретным объектам в массиве осуществляется по номеру объекта. Элементы массива всегда располагаются в памяти последовательно.
Объявление массива выглядит следующим образом:
тип имя_массива[размер]
Похоже на объявление обычной переменной, за исключением того, что указывается размерность массива. Например:
int mas[10]; // массив из 10 целых чисел
float myOwnArray[2]; // массив из 2 вещественных чисел
someType array[15]; // массив из 15 объектов типа someType
При объявлении массива его размер должен быть известен на момент компиляции, например, можно написать так:
const int size = 10;
char arr[size];
Некоторые компиляторы позволяют пропускать модификатор const в таких объявлениях, если значение переменной известно на этапе компиляции. То есть они могут допускать и такие объявления:
int size = 10;
char arr[size];
В то же время другие компиляторы выдадут на такой код ошибку, поэтому использовать неконстантные переменные для хранения размера массива нежелательно. А следующий пример не будет работать ни в одном компиляторе:
int size;
cin >> size;
char arr[size]; // ошибка: значение size неизвестно на момент компиляции
Доступ к элементам массива осуществляется с помощью индекса – порядкового номера элемента внутри массива. Для этого используется следующий синтаксис:
имя_массива[индекс]
В C++ нумерация массивов всегда начинается с 0. Т.е. первый элемент имеет индекс 0, второй – 1, а последний – n-1, где n – размер массива. Например, заполнение массива случайными числами:
#include <iostream>
#include <time.h>
void main()
{
const short size = 50;
long array[size];
srand(time(NULL));
for (int i = 0; i < size; i++) {
array[i] = rand();
std::cout << array[i] << ' ';
}
}
Здесь показан наиболее часто используемый способ работы с массивами – перебор всех элементов в цикле, где счетчик изменяется от 0 до size-1.
Предостережение! Типичная ошибка при работе с массивом – выход индекса за границы массива. Это никак не проверяется компилятором, более того, при выполнении программы также не будет никаких сообщений о подобных ошибках. Просто программа будет использовать данные из области памяти, находящейся за пределами массива. При чтении такой памяти будет получено некоторое произвольное значение, находящееся по этому адресу. А при попытке записи – разрушение каких-то данных. Всегда нужно помнить, что нумерация массивов начинается с 0 и в соответствии с этим составлять условия в циклах, предназначенных для перебора элементов массива.
Графически одномерный массив, например, a[5], может быть представлен следующим образом:
a[0]
a[1]
a[2]
a[3]
a[4]
Массивы могут быть инициализированы сразу при объявлении. При этом начальные значения всех элементов записываются в фигурных скобках через запятую. Например:
int vec[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9};
Здесь объявлен массив из 10 элементов, а инициализируется он 9 значениями. Указанные в {} значения будут присвоены первым 9ти элементам массива. Последний, 10й элемент, которому «не хватило» значения, будет инициализирован нулем.
Если массив инициализируется сразу при объявлении, его размер можно не указывать, достаточно указать пустые квадратные скобки:
Предостережение! Массивы нельзя выводить на экран как обычные переменные, например, так:
int a[10];
...
cout << a; // массив так на экран не вывести
В зависимости от компилятора на последнюю строку может быть выдана ошибка, т.к. cout ничего не знает про массивы и не умеет их выводить, либо на экран будет выведен адрес массива в памяти.
Поэтому выводить массивы нужно поэлементно, то есть:
int a[10];
...
for (int i = 0; i < 10; i++)
cout << a[i] << ' ';
Пример программы сортировки одномерного массива по возрастанию (методом пузырька):
#include <iostream>
#include <time.h>
using namespace std;
const int size = 20; // размер массива
void main()
{
int m[size];
int t; // переменная для обмена значениями двух элементов массива