Рубанчик В.Б. |
Лабораторная работа "Передача массивов в функции" |
|
Лабораторная работа
Тема: Передача массивов в функции
Цель работы: Изучить особенности использования массивов как аргументов функций
Передача параметров в функцию
При работе с функциями различают формальные и фактические параметры.
Формальные параметры появляются на этапе разработки программы при описании функции. Это переменные, которыми обозначают аргументы в определении функции:
void func(int x, double y){...}
Понятие "фактические параметры" относится к вызовам функций.
При вызове функции каждому формальному параметру должно соответствовать некоторое выражение того же типа, что и формальный параметр. При обработке вызова компилятор вычисляет эти выражения и, если необходимо, неявно преобразует результаты к типам формальных параметров. Только после этого управление передается в вызываемую функцию. Например, вызов функции func
int z=2;
func(z+3,1);
будет преобразован компилятором в
func(5,(double)1);
Полученные значения аргументов будут использоваться при вычислении функции. Поэтому называются фактическими.
Если фактический параметр задан переменной, то возникает вопрос: а что передается в функцию, сама переменная или её значение? В программировании эти два способа передачи аргументов называются, соответственно, "передача параметров по ссылке" и "передача параметров значением".
Если параметры передаются по ссылке, то вызванная функция будет оперировать непосредственно переменными из вызывающей функции. Изменение значений переменных внутри вызванной функции будет означать изменение значений в вызывающей функции.
При передаче параметров значением каждый формальный параметр будет инициализирован значением соответствующего фактического параметра. Функция будет работать с копиями значений, а не с самими фактическими параметрами.
Формальные параметры функции являются её локальными переменными, которые не видны вызывающей функции. Поэтому изменения значений формальных параметров, сделанное внутри вызванной функции, не отражаются на переменных вызывающей функции.
В Си передача параметров выполняется значением. Однако есть возможность имитировать передачу параметров по ссылке.
Пусть в функцию передается адрес объекта, определенного в вызывающей функции. По правилам Си этот адрес будут скопирован в формальный параметр. Но эта копия по-прежнему будет хранить реальный адрес объекта.
Если внутри функции разыменовать такой параметр, то действия будут выполняться прямо с объектом вызывающей функции. Благодаря этому появляется возможность возвращать результаты работы функции через аргументы и, в частности, объясняет, почему при вызове функции scanf нужно указывать не переменные, а их адреса.
ЗАДАНИЕ 1 (исследование механизма передачи параметров)
1. В функции main описываются две переменные x и y типа int, инициализируемые значениями 5 и 10.
2. В программе создается функция
void pass_param(int x, int* py),
в которой выполняется инкремент значения x и декремент значения, хранящегося по адресу py.
3. В функции main вызывается функция pass_param, которой передаются переменная x и адрес переменной y.
4. После выполнения вызова на экран выводятся значения x и y.
Объяснить результаты.
