Главная страница Случайная страница Разделы сайта АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника |
Передача параметров в функцию
Часто требуется, чтобы одна функция изменяла значения переменных, относящихся к другой функции. Предположим, что у нас имеются две переменные x и y, и мы хотим, чтобы они обменялись своими значениями. Схематически такой обмен представлен на рис 5.1. 2
1 3
Рис.5.1
Для обмена двумя значениями вводится временная переменная temp, согласованная по типу с переменными x и y. Последовательность операций здесь следующая: temp = x; x = y; y = temp; Рассмотрим программу, реализующую обмен конкретными значениями. Пример 5.2. Программа обмен #include < stdio.h> void obmen(int, int); // Прототип функции void main (void) { int x = 5, int y = 20; printf (“ x = %d y = %d”, x, y); obmen (x, y); // Вызов функции printf (“После обмена: x = %d y = %d”, x, y); } // Описание функци void obmen(int a, int b); { int temp; temp = a; a = b; b = temp; } На входе программы a и b получили значения x и y, но на выход результат не передавался и значения внешних переменных x и y не изменились. Результат работы программы будет выглядеть следующим образом: x = 5 y = 20. После обмена значениями: x = 5 y = 20, т.е. значения переменных не поменялись местами. Это произошло потому, что по правилам языка Си параметры функции являются параметрами - значениями. Это означает, что в момент обращения к функции, ей в качестве фактических параметров передаются не сами переменные, а их копии в виде значений, которые они имеют в данный момент. Изменение значений локальных переменных a и b никак не сказывается на значениях x и y. Это совершенно различные переменные. Каким же образом все - таки поменять значения переменных x и y в программе? Для этого следует использовать указатели. Почему? Потому что указатель – это адрес переменной, следовательно, используя указатель можно осуществлять доступ к самой переменной. Значение указателя и в вызывающей программе и в функции, которой это значение передано, указывает на одну и ту же переменную. Как будет выглядеть правильная программа? Запишем ее. Пример 5.3. # include < stdio.h> void obmen (int*, int*); void main(void) { int x = 5, y = 20; printf (…); obmen (& x, & y); //адрес x, y = указателю на a и b. printf (“ x = %d y = %d”, x, y); } void obmen (int*a, int*b) { int temp; temp = *a; //разадресация, т.е. берется значение по адресу *a = *b; *b = temp; } Теперь программа будет работать правильно. Декларация void obmen (int*, int*) говорит о том, что в качестве аргументов в функцию obmen () следует передать указатели (адреса). Вот почему при вызове функции в качестве фактических параметров используют & x и & y, т.е.: obmen (& x, & y).
|