ВУЗ:
Составители:
Рубрика:
18
В языке Cи существует сильная взаимосвязь между ссылками и масси-
вами, настолько сильная, что ссылки и массивы фактически надо рассматривать од-
новременно.
Любое действие, которое достигается индексированием массива, может быть
выполнено и с помощью ссылок. Вариант со ссылками в общем-то будет быстрее,
но он, по крайней мере для начинающих, несколько тяжеловат для понимания.
Описание int a[10] определяет массив а размером в 10 элементов, т.е. это
блок из 1 0 последовательных объектов, именуемых a[0], a[1],..., a[9]. Запись a[i]
обозначает элемент в i-й позиции от начала.
Если pa это ссылка на целое значение, описанная как
int pa;
то присваивание: pa=&a[0] устанавливает в pa ссылку на нулевой элемент a, т.е. pa
содержит адрес a[0].Теперь присваивание x= pa копирует содержимое a[0] в x.
Если содержимое pa указывает на отдельный элемент массива а, то по опре-
делению pa+1 указывает на следующий элемент, и, вообще, pa - i указывает на i-й
элемент перед pa, а pa+1 на i-й элемент после. Таким образом, если pa указывает
на a[0], то *(pa+1) относится к содержимому a[1], pa+i есть адрес a[i], a *(pa+i) есть
содержимое a[i].
Эти замечания справедливы вне зависимости от типа переменных в массиве
а. Определение операции "добавление 1 к ссылке" и другой ссылочной арифметики
подразумевает масштабирование, связанное с размером памяти для объекта, на
который указывает ссылка. Таким образом, в pa+i значение i, прежде, чем будет до-
бавлено к pa, будет умножено на размер объекта, на который указывает pa. Оче-
видно, что между индексированием и ссылочной арифметикой связь очень тесная.
Фактически любое упоминание массива приводится транслятором к ссылке на нача-
ло этого массива, т .е. имя массива есть ссылочное выражение. Это приводит к не-
большому числу полезных следствий. Так как имя массива есть синоним для место-
положения нулевого элемента, то присваивание pa=&a[0] можно записать и в таком
виде: pa=a Не удивительно теперь, по крайней мере на первый взгляд, что значе-
ние a[i] можно записать как *(a+i). Вычисляя a[i], транслятор сразу же переводит
его в *(a+i); эти две формы полностью эквивалентны. Применяя операцию & к обе-
им частям этого равенства, получаем, что &a[i] и a+i также идентичны: a+i - адрес i-
го элемента относительно а. С другой стороны, если pa - ссылка, то ее можно ис-
пользовать с индексом: pa[i] идентично *(pa+i). Короче, любой массив и индексное
Страницы
- « первая
- ‹ предыдущая
- …
- 16
- 17
- 18
- 19
- 20
- …
- следующая ›
- последняя »