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 ]