Чаще всего параметры передают через регистры или через стек.
Передавать через регистры быстро, но количество регистров ограничено. Передать можно только небольшое число параметров.
Самый популярный способ — передавать параметры через стек. Вызывающий код помещает аргументы в стек вызовов и вызывает подпрограмму.
Разберёмся, как стек вызовов устроен.
Допустим, мы пишем программу на С++. Первой вызывается функция main(). В ней вызывается функция A. Она вызывает функцию B, которая, в свою очередь, вызывает C.
Так выглядит стек вызовов:
После возврата из функции управление должно вернуться туда, откуда её вызвали. При вызове функции в стеке сохраняется адрес возврата. Это адрес в памяти инструкции, которая следует за вызовом функции.
Для примера рассмотрим функцию, которая приветствует пользователя по имени и выдаёт гороскоп на сегодняшний день в соответствии с его именем. Для простоты предположим, что пользователь пришёл на сайт, где всем выдают один и тот же гороскоп.
Скопировать кодPYTHON
def say_hello(name):
print("Привет, {}".format(name))
print_horoscope(name)
print('Пока, {}, хорошего дня!'.format(name))
def print_horoscope(name):
print('{}! Сегодня подходящий день для прогулок в парке и изучения рекурсии'.format(name))
В Python есть функция input(), которая считывает значение со стандартного ввода. В других языках программирования существуют аналогичные функции. Пришедшее на вход значение можно сохранять в переменной и использовать далее в коде.
Введём имя:
Скопировать кодPYTHON
name = input()
Теперь можно вызвать функцию say_hello(), передав ей параметром имя:
Скопировать кодPYTHON
say_hello(name)
Предположим, мы передали в input() значение Гоша и вызвали say_hello() с этим параметром.