Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
A.doc
Скачиваний:
36
Добавлен:
09.04.2015
Размер:
5.6 Mб
Скачать

219 Глава 5

Вывод этого примера выглядит следующим образом:

Описание полученных результатов

Я вновь использовал разные имена параметров в прототипе и заголовке функции, просто чтобы напомнить, что это возможно (правда, в данном случае это ничем не улучшает программу). Первый параметр определен как массив с произвольным коли- чеством строк, каждая из которых содержит четыре элемента. Функция вызывается с массивом beans, состоящим из трех строк. Второй аргумент специфицирован как частное от деления общего размера массива в байтах на размер его первой строки. В результате вычисления это дает количество строк в массиве.

Вся вычислительная работа функции выполняется во вложенных циклах for, где внутренний цикл суммирует элементы отдельной строки, а внешний цикл повторяет- ся для каждой строки.

Использование указателя вместо многомерного массива в качестве аргумента функции в этом примере не очень подходит. Когда передается массив, то на самом деле передается значение адреса, которое в данном случае указывает на первую стро- ку — массив из четырех элементов. Это само по себе не обеспечивает простых опера- ций с указателем внутри функции. В этом случае придется модифицировать оператор во вложенном цикле for следующим образом:

поэтому вычисления в нотации массива все-таки выглядят яснее.

Ссылки как аргументы функции

Теперь перейдем ко второму из двух механизмов передачи аргументов в функцию. Спецификация параметра функции в виде ссылки изменяет метод передачи параме- тра. Этот метод не передает аргумент по значению, когда он копируется перед тем, как быть переданным в функцию, а передается по ссылке — то есть параметр выступа- ет псевдонимом передаваемого аргумента. Это исключает всякое копирование и обе- спечивает функции прямой доступ к аргументу. Это также означает, что нет необходи- мости в разыменовании, которое необходимо при передаче указателей на значения.

Вернемся к очень простому примеру Ех5_03. срр и попробуем переписать его так, чтобы использовать параметры-ссылки:

Структурная организация программ 220

Эта программы генерирует следующий вывод:

Описание полученных результатов

Вы должны согласиться с тем, что способ работы этого примера замечателен. По сути, это то же самое, что и Ех5_03. срр, за исключением того, что функция в каче- стве параметра использует ссылку. Этот факт отражает измененный прототип. Когда функция вызывается, аргумент передается ей точно так же, как и в случае передачи по значению, поэтому он используется точно так же, как и в предыдущей версии. Значение аргумента функции не передается. Параметр функции инициализируется адресом аргумента, поэтому всякий раз, когда параметр num используется в функции, он непосредственно обращается к переданному аргументу.

Дабы исключить неправильное толкование использования аргумента num в main () — одноименного с тем, что используется в функции — второй раз она вызыва- ется с переменной value в качестве аргумента. На первый взгляд это может создать у вас впечатление некоторого противоречия с тем, что я говорил раньше — о том, что основное свойство ссылки таково, что после ее объявления и инициализации она не может быть переназначена на другую переменную. Но здесь никакого противоречия нет, потому что ссылка, как параметр функции, создается и инициализируется при каждом вызове функции и разрушается по ее завершении, поэтому каждый раз вы по- лучаете совершенно новую ссылку.

Внутри функции полученное ею значение отображается на экране. Хотя оператор, по сути, тот же самый, что и использованный ранее для вывода адреса, сохраненного в указателе, на этот раз выводятся значение num, а не адрес, потому что num — ссылка.

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