Несмотря на то, что в С++ по умолчанию используется вызов по значению, можно вручную создать вызов по ссылке, пepeдав в функцию адрес аргумента (т. е. указатель). В этом случае возникает возможность изменения значения аргумента вне функции. Как вы знаете, указатели передаются в функцию в принципе точно так же, как и любые другие значения. Разумеется, необходимо объявить параметры функции как указатели.
Чтобы убедиться в том, что передача указателя позволяет вручную создать вызов по ссылке, рассмотрим функцию, названную swap( ), которая обменивает значения двух переменных, на которые указывают ее аргументы. Один из способов реализации функции приведен ниже:
// Обмен значений переменных, на которые указывают х и у.
void swap(int *х, int *у)
{ .
int temp;
temp = *x; // сохраним значение с адресом х
*х = *у; // отправим значение из у в х
*у = temp; // отправим значение из х в у
}
Функция swap() объявляет два параметра-указателя х и у. Она использует эти параметры для обмена значений переменных, на которые указывают аргументы, передаваемые функции. Вспомним, что *х и *y обозначают переменные, находящиеся по адресам х и у. Таким образом, предложение
*x = *у;
помещает объект, на который указывает у, в объект, на который указывает х. В результате, когда функция завершается, значения переменных, использованных при вызове функции, поменяются местами.
Поскольку swap() ожидает получения двух указателей, вы должны вызывать swap() с указанием адресов переменных, у которых надо обменять значения. Как это делается, показано в приведенной ниже программе:
//Демонстрация варианта swap() с указателями.
#include <iostream>
using namespace std;
// Объявим, что swap() использует указатели,
void swap(int *x, int *y);
int main()
{
int i, j;
i = 10;
j = 20;
cout << "Исходные значения i и j: ";
cout << i << ' ' << j << '\n';
swap(&j, &i); // вызов swap () с адресами i и j
cout << "Новые значения i и j: " ;
cout << i << ' ' << j << '\n';
return 0;
}
//Обменяем значения, на которые указывают х и у.
void swap(int *x, int *y)
{
int temp;
temp = *x; // сохраним значение с адресом х
*x = *y, // поместим значение с адресом у
//в переменную с адресом х
*y = temp; //поместим значение с адресом х
//в переменную с адресом у
}
В функции main( ) переменной i присваивается значение 10, а переменной j - 20. Затем вызывается swap( ) с адресами i и j в качестве аргументов. Унарный оператор & позволяет получить адреса переменных. В результате в swap( ) передаются не значения переменных, а их адреса. После возврата из swap() значения iи j поменяются местами, как это видно из приведенного ниже вывода программы: