772______________________________Wacrb //. Программирование на C++

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

Почему номер первого элемента равен нулю

Массив — это блок памяти, содержащий непрерывный ряд данных одинакового типа. Это означает, что элемент 2 находится в памяти на таком же расстоянии от элемента 1, что и элемент 3 от элемента 2. Любой элемент массива можно найти, добавив к адресу первого элемента произведение индекса на размер типа данных:

(base_address + (index * sizeof(an element)) (базовый адрес + (индекс * sizeof(элемент))

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

Естественным образом базовым становится индекс 0. В результате, этим выражением уже можно пользоваться. C++ позволяет обращаться к элементам массива подобным образом, но операция массива предоставляет в ваше распоряжение гораздо более простую нотацию:

poi.nter[ index ]; // pointer равен базовому адресу

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

Return_Type &operator[](Index); // оператор-функция массив

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

(base_address + (index * sizeof(an element))

приводится к простой нотации

base address[ Index ]