- •6 Глава 1
- •12 Глава 1
- •14 Глава 1
- •16 Глава 1
- •18 Глава 1
- •20 Глава 1
- •22 Глава 1
- •24 Глава 1
- •26 Глава 1
- •31 Глава 1
- •34 Глава 2
- •36 Глава 2
- •Puc. 2.4. Дополнительные опции консольного приложения Win32
- •38 Глава 2
- •40 Глава 2
- •42 Глава 2
- •44 Глава 2
- •48 Глава 2
- •50 Глава 2
- •52 Глава 2
- •54 Глава 2
- •56 Глава 2
- •58 Глава 2
- •60 Глава 2
- •62 Глава 2
- •64 Глава 2
- •66 Глава 2
- •68 Глава 2
- •70 Глава 2
- •74 Глава 2
- •76 Глава 2
- •79 Глава 2
- •82 Глава 2
- •84 Глава 2
- •86 Глава 2
- •88 Глава 2
- •92 Глава 2
- •94 Глава 2
- •96 Глава 2
- •98 Глава 2
- •103 Глава 2
- •105 Глава 2
- •107 Глава 2
- •110 Глава 2
- •115 Глава 3
- •119 Глава 3
- •121 Глава 3
- •123 Глава 3
- •125 Глава 3
- •129 Глава 3
- •131 Глава 3
- •133 Глава 3
- •139 Глава 3
- •141 Глава 3
- •143 Глава 3
- •145 Глава 3
- •148 Глава 3
- •150 Глава 3
- •155 Глава 3
- •165 Глава 4
- •168 Глава 4
- •170 Глава 4
- •173 Глава 4
- •175 Глава 4
- •178 Глава 4
- •184 Глава 4
- •186 Глава 4
- •188 Глава 4
- •190 Глава 4
- •192 Глава 4
- •194 Глава 4
- •198 Глава 4
- •201 Глава 5
- •203 Глава 5
- •205 Глава 5
- •207 Глава 5
- •213 Глава 5
- •217 Глава 5
- •219 Глава 5
- •221 Глава 5
- •223 Глава 5
- •225 Глава 5
- •227 Глава 5
- •232 Глава 5
- •234 Глава 5
- •236 Глава 5
219 Глава 5
Вывод этого примера выглядит следующим образом:
Описание полученных результатов
Я вновь использовал разные имена параметров в прототипе и заголовке функции, просто чтобы напомнить, что это возможно (правда, в данном случае это ничем не улучшает программу). Первый параметр определен как массив с произвольным коли- чеством строк, каждая из которых содержит четыре элемента. Функция вызывается с массивом beans, состоящим из трех строк. Второй аргумент специфицирован как частное от деления общего размера массива в байтах на размер его первой строки. В результате вычисления это дает количество строк в массиве.
Вся вычислительная работа функции выполняется во вложенных циклах for, где внутренний цикл суммирует элементы отдельной строки, а внешний цикл повторяет- ся для каждой строки.
Использование указателя вместо многомерного массива в качестве аргумента функции в этом примере не очень подходит. Когда передается массив, то на самом деле передается значение адреса, которое в данном случае указывает на первую стро- ку — массив из четырех элементов. Это само по себе не обеспечивает простых опера- ций с указателем внутри функции. В этом случае придется модифицировать оператор во вложенном цикле for следующим образом:
поэтому вычисления в нотации массива все-таки выглядят яснее.
Ссылки как аргументы функции
Теперь перейдем ко второму из двух механизмов передачи аргументов в функцию. Спецификация параметра функции в виде ссылки изменяет метод передачи параме- тра. Этот метод не передает аргумент по значению, когда он копируется перед тем, как быть переданным в функцию, а передается по ссылке — то есть параметр выступа- ет псевдонимом передаваемого аргумента. Это исключает всякое копирование и обе- спечивает функции прямой доступ к аргументу. Это также означает, что нет необходи- мости в разыменовании, которое необходимо при передаче указателей на значения.
Вернемся к очень простому примеру Ех5_03. срр и попробуем переписать его так, чтобы использовать параметры-ссылки:
Структурная
организация
программ
Эта программы генерирует следующий вывод:
Описание полученных результатов
Вы должны согласиться с тем, что способ работы этого примера замечателен. По сути, это то же самое, что и Ех5_03. срр, за исключением того, что функция в каче- стве параметра использует ссылку. Этот факт отражает измененный прототип. Когда функция вызывается, аргумент передается ей точно так же, как и в случае передачи по значению, поэтому он используется точно так же, как и в предыдущей версии. Значение аргумента функции не передается. Параметр функции инициализируется адресом аргумента, поэтому всякий раз, когда параметр num используется в функции, он непосредственно обращается к переданному аргументу.
Дабы исключить неправильное толкование использования аргумента num в main () — одноименного с тем, что используется в функции — второй раз она вызыва- ется с переменной value в качестве аргумента. На первый взгляд это может создать у вас впечатление некоторого противоречия с тем, что я говорил раньше — о том, что основное свойство ссылки таково, что после ее объявления и инициализации она не может быть переназначена на другую переменную. Но здесь никакого противоречия нет, потому что ссылка, как параметр функции, создается и инициализируется при каждом вызове функции и разрушается по ее завершении, поэтому каждый раз вы по- лучаете совершенно новую ссылку.
Внутри функции полученное ею значение отображается на экране. Хотя оператор, по сути, тот же самый, что и использованный ранее для вывода адреса, сохраненного в указателе, на этот раз выводятся значение num, а не адрес, потому что num — ссылка.
Это наглядно демонстрирует разницу между ссылкой и указателем. Ссылка — псевдоним дру- гой переменной, а потому может использоваться в качестве ее альтернативного имени. Это полностью эквивалентно применению ее исходного имени.