При использовании указателей в качестве формальных параметров им передаются адреса соответствующих фактических параметров. Рассмотрим решение предыдущего примера, используя указатели.
Пример 2
//Прототип функции swap с использованием указателей
voidswap(int *x,int *y);// Формальные параметры – указатели
void main ()
{
. . . . .
swap(&i, &j);//Вызов функции. Фактические параметры – адреса переменных i и j
. . . . .
}
// Определение функции swap
voidswap(int *x,int *y)
{inttemp;
temp =*x;// Временно сохраняем значение, расположенное по адресу x
* x = *y;// Помещаем значение, хранимое по адресу y, по адресу x
*y = temp;// Помещаем значение, которое раньше хранилось
// по адресу x, по адресу y
}
Результат
Исходные значения переменных i и j: 10 20
Значения переменных i и j после обмена: 20 10
Обмен произошел, так как функции swap при вызове были переданы адреса переменных, а не их значения.
Ссылочный параметр – это специальный тип указателя, который позволяет работать с указателем как с обычной переменной. При использовании ссылочного параметра функции автоматически передается адрес (а не значение) аргумента. При выполнении кода функции, а именно при выполнении операций над ссылочным параметром, обеспечивается его автоматическое разыменование и поэтому программисту не нужно использовать операторы, работающие с указателями.
Ссылочный параметр объявляется с помощью символа «&», который должен предшествовать имени параметра в объявлении функции, естественно, такое же обозначение используется в списке типов параметров в заголовке функции.
Операции, выполняемые над ссылочным параметром, влияют на аргумент (фактический параметр), а не на ссылочный параметр.
Чтобы лучше понять механизм действия ссылочных параметров, рассмотрим предыдущий пример.
Пример 3
//Прототип функции swap с использованием ссылочных параметров
voidswap(int &x,int &y); // xи y – ссылочные параметры
void main ()
{ . . . . .
swap(i,j);//Вызов функции
. . . . .
}
// Определение функции swap
void swap(int &x,int &y)
{inttemp;
temp =x;// Сохраняем значение, расположенное по адресу x
x = y; // Помещаем значение, хранимое по адресу y, по адресу x
y = temp; // Помещаем значение, которое раньше хранилось
// по адресу x, по адресу y
}
Обратите внимание, что объявление x и y ссылочными параметрами, освобождает вас от необходимости использовать оператор «*» при организации обмена. Кроме того, вызывается функция swapобычным способом: передачей в нее имен аргументов. Результат работы программы тот же, что и в примере 2, т. е. обмен произведен.
Как уже отмечалось, функция может возвращать только одно значение. Передача же аргументов по ссылочному параметру или с помощью указателей эквивалентна возврату нескольких значений. В этом случае функция по-прежнему возвращает одно значение, но теперь переданные в функцию параметры можно изменять. Таким образом, фактически возвращаемых значений может быть несколько!
Массивы могут быть параметрами функций, и функции могут возвращать указатель на массив в качестве результата.
Не надо путать размер массива и размерность массива. Размер массива – количество элементов, размерность массива – количество индексов. Например, mass[3][4][5] – трехмерный массив размером 3´4´5 = 60 элементов.
Для передачи в функцию одномерного массива достаточно передать адрес его нулевого элемента, носителем которого является само имя этого элемента, т. е. если х – имя массива, то выражения &х[0] и х эквиваленты. В качестве формального параметра в определении функции и в прототипе нужно использовать указатели на переменные соответствующего типа. Можно в этом качестве использовать и описание массива (без указания размера и без списка начальных значений). Например, необходимо написать и протестировать функцию, которая определяет произведение и сумму членов целочисленного одномерного массива.
Пример 4
#include <iostream>
#include <iomanip>
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.