Глава 4. Функции
87
соотнесет с каждым ее параметром определенный адрес некоторого
места в так называемой стековой памяти, созданной специально для
обеспечения вызова подпрограмм из других программ. А функция —
это ведь тоже своего рода подпрограмма, да еще и возвращающая неко-
торое значение, а не только получающая какой-то результат расчетов.
Размер такой адресованной области для каждого параметра определяет-
ся типом описанного формального параметра. Выделяется место и для
будущего возвращаемого результата.
В теле функции будет построен программный код, работающий, когда
речь идет о формальных параметрах, с адресами не обычной, а стековой
памяти. Когда мы, обращаясь к функции, передаем ей фактические зна-
чения параметров, то эти значения пересылаются по тем адресам стека,
которые были определены для формальных параметров (т. е. кладутся
на "полочки" в стеке, отведенные для формальных параметров). Но про-
граммный код тела функции как раз и работает с этими "полочками",
содержащими параметры. Поскольку тело строится так, что оно работа-
ет с "полочками", то остается только класть на них разные данные и
получать соответствующие результаты. Вот это и осуществляется, когда
мы каждый раз передаем функции конкретные значения ее параметров.
Отсюда можно сделать выводы: поскольку передаваемые функции зна-
чения пересылаются в стековую память (т. е. там формируется их ко-
пия), то сама функция, работая со стеком и ни с чем другим, не может
изменять значения переменных, которые подставляются в ее заголовоч-
ную часть вместо формальных параметров. В примере мы писали
float
y=salary(tn,ms)
, подставляя вместо формальных параметров
TabNom
и
Mes
значения переменных
tn
и
ms
. И мы утверждаем, что значения
tn
и
ms
не изменятся. Если же передавать функции не значения переменных,
а их адреса, то переменные, адреса которых переданы в качестве факти-
ческих параметров, смогут изменяться в теле функции. Ведь по адресу
можно записать все, что угодно, где бы он ни находился (в стеке или
в обычной памяти). Мы уже фактически обнародовали тот факт, что
функции в качестве параметров можно передавать и адреса тех данных,
которые должны служить исходными для работы функции. Эти адреса
называются
ссылками
. Параметры помечаются квалификатором
ref
.
Например,
float func(x1, ref x2);
Если нужно просто вернуть значение из функции, а не изменить суще-
ствующее значение, то следует использовать ключевое слово
out
:
static void func(double a, out string x1, out int x2);
88
Do'stlaringiz bilan baham: |