Информатика: Методические указания к лабораторным работам № 1-5. Функции. Обработка символьных данных. Организация работы с файлами, страница 3

При использовании указателей в качестве формальных параметров им передаются адреса соответствующих фактических параметров. Рассмотрим решение предыдущего примера, используя указатели.

Пример 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

}

Результат

Исходные значения переменных  и  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>