Double c;
cout << "Function Obmen start:\n *x=" << *x << " *y=" << *y << endl; c = *x; *x = *y; *y = c; cout << "Function Obmen end:\n *x=" << *x << " *y=" << *y << endl; } Результаты выполнения программы: Do Obmen: a=2.5 b=3.1 Function Obmen start: *x=2.5 *y=3.1 Function Obmen end: *x=3.1 *y=2.5 Posle Obmen: a=3.1 b=2.5 Печать на экране монитора наглядно показывает, что обмен произведён, и исходные переменные теперь имеют новые значения, т.е. передача данных по адресу действительно позволяет вернуть в вызывающую функцию результат работы вызываемой подпрограммы. Как это работает? Рассмотрим данный вопрос подробнее, используя пример с обменом данных. Для наглядности приведём рисунок: В вызывающей функции (в нашем случае — в main()) вычисляются адреса объектов, передаваемых по адресу (у нас — адреса переменных a и b. Пусть это будут числа 1000 и 1008), и затем эти адреса копируются в ячейки памяти — указатели, память под которые выделена в функции Obmen() (это x и y). Зная адрес переменной, например, адрес переменной a, который теперь хранится в указателе x, можно, пользуясь операцией разыменование, не только прочитать, но и изменить значение исходной переменной. Ни какой реальной передачи данных (в смысле копирования) из подпрограммы Obmen() назад в main() не делается. Мы на самом деле через указатели работаем с исходными объектами! Поэтому после выхода из функции Obmen() имеем изменённые переменные a и b (если быть точнее, переменные изменятся ещё до выхода из функции,то есть в момент перестановки в самой функции Obmen()).
|