Массив - это непрерывная область памяти (буфер) определенного типа.
С++ на уровне языка определяет для этого два средства: статические массивы (
a[10]
) и выделение блоков памяти, на которые можно ссылаться через указатель (
int *a = new int[10];
)
Но, в отличие от многих других языков, C++ не котролирует выход за границы массива, в результате чего можно сделать так:
int a[10];
a[333] = 5; // запись в ячейку памяти
//по адресу 334 * sizeof(int) от начала массива.
Кроме того, для массивов, расположеных в куче (выделенных с помощью
new
) нельзя определить их реальные размеры (для статических массивов мы можем сделать
sizeof(a)/sizeof(int)
). Кроме того передавать многомерные массивы в функции, оперировать с динамическими массивами (изменяющими размер в процессе работы) и многие другие проблемы. Для их решения существует класс
std::vector
, который дарит нам абстракцию над массивом в хипе.
PS С С++11 появился еще
std::array
, который является абстракцией над статическим массивом.