Передача аргументов в функцию
В языке Си аргументы при стандартном вызове функции передаются по значению. Это означает, что в стеке, как и в случае локальных данных, выделяется место для формальных параметров функции. В выделенное место при вызове функции заносятся значения фактических аргументов, при этом проверяется соответствие типов и при необходимости выполняются их преобразования. При несоответствии типов выдается диагностическое сообщение. Затем функция использует и может изменять эти значения в стеке.
При выходе из функции измененные значения теряются, т.к. время жизни и зона видимости локальных параметров определяется кодом функции. Вызванная функция не может изменить значения переменных, указанных как фактические аргументы при обращении к данной функции.
В случае необходимости функцию можно использовать для изменения передаваемых ей аргументов. В этом случае в качестве аргумента необходимо в вызываемую функцию передавать не значение переменной, а ее адрес.
При передаче по адресу в стек заносятся копии адресов аргументов, а функция осуществляет доступ к ячейкам памяти по этим адресам и может изменить исходные значения аргументов. Для обращения к значению аргумента-оригинала используется операция «*».
Пример функции, в которой меняются местами значения x и y:
void zam(int *x, int *y)
{
int t = *x;
*x = *y;
*y = t;
}
Участок программы с обращением к данной функции:
void zam (int*, int*);
void main (void)
{
int a=2, b=3;
printf(" a = %d , b = %d\n", a, b);
zam (&a, &b);
printf(" a = %d , b = %d\n", a, b);
}
При таком способе передачи данных в функцию их значения будут изменены, т.е. на экран монитора будет выведено
a = 2 , b=3
a = 3 , b=2
Если требуется запретить изменение значений какого-либо параметра внутри функции, то в его декларации используют атрибут const, например:
void f1(int, const double);
Рекомендуется указывать const перед всеми параметрами, изменение которых в функции не предусмотрено. Это облегчает, например, отладку программы, т.к. по заголовку функции видно, какие данные в функции изменяются, а какие нет.
Операция typedef
Любому типу данных, как стандартному, так и определенному пользователем, можно задать новое имя с помощью операции typedef:
typedef тип новое_имя ;
Введенный таким образом новый тип используется аналогично стандартным типам, например, введя пользовательские типы:
typedef unsigned int UINT; – здесь UINT – новое имя;
typedef char M_s [101]; – здесь M_s – тип пользователя, определяющий строки, длиной не более 100 символов.
Декларации объектов введенных типов будут иметь вид
UINTi, j; ® две переменные типа unsigned int ;
M_s str[10]; ® массив из 10 элементов, в каждом из которых можно хранить по 100 символов.
Рассмотренная операция упростит использование указателей на функции, которые рассматриваются в следующем разделе.
Дата добавления: 2017-10-04; просмотров: 1133;