Существует несколько способов отправки данных (или переменных) в качестве аргумента функции. Двумя наиболее распространенными являются передача по значению и передача по ссылке.
Пример:
С++
// C++ Program to demostrate
// Pass by value and
// Pass by refernce
#include <iostream>
using
namespace
std;
// Pass by refernce
void
swap(
int
& x,
int
& y)
{
int
temp = x;
x = y;
y = temp;
}
// Pass by value
int
sum(
int
x,
int
y) {
return
x + y; }
int
main()
{
int
x = 1, y = 2;
cout <<
"Before swap:"
<< x <<
" "
<< y << endl;
swap(x, y);
cout <<
"After swap:"
<< x <<
" "
<< y << endl;
int
c = sum(x, y);
cout <<
"Sum:"
<< c << endl;
return
0;
}
Выход
Before swap:1 2 After swap:2 1 Sum:3
Другой менее известный метод — Call by Pointer. Передача указателя позволяет функции изменять переменную без создания копии.
Вызов по указателю
Когда для передачи аргументов функции используется метод вызова по указателю, адрес переменной передается функции в качестве аргумента. Функция сохраняет этот адрес переменных в переменной-указателе. Следовательно, переменная внутри функции является псевдонимом для переданной переменной, поскольку обе содержат один и тот же адрес. Следовательно, любые операции, выполняемые над переменной внутри функции, также будут отражены в вызывающей функции.
Эта способность отражать изменения может возвращать более одного значения функцией.
Кроме того, функция void может технически возвращать значения, используя этот метод.
Оператор & ( адрес ) в фактических параметрах обозначает значения, передаваемые по указателю в функции.
Вызов функции по указателю
Передача адреса переменной из вызывающей функции и использование их в качестве указателя внутри функции называется вызовом по указателю. Этот метод позволяет более четко видеть функции, в которых может измениться значение переданных переменных. т. е. при передаче по ссылке в вызове функции нет указаний, по которым можно было бы определить, что в ней может измениться значение переданных переменных (поскольку вызов идентичен вызову по значению). Но в вызове по указателю адресный оператор & используется в вызове функции, предоставляя немного больше информации о характере функции.
Пример:
С++
// C++ program to implement
// pass-by-reference with pointers
#include <iostream>
using
namespace
std;
void
f(
int
*x)
{
*x = *x - 1;
}
// Driver code
int
main()
{
int
a = 5;
cout << a << endl;
f(&a);
cout << a << endl;
}
Выход
5
4
Объяснение: Во-первых, функция определяется с типом возвращаемых данных void и принимает значения в виде указателей (что обозначается знаком звездочки * в формальных параметрах). Функция уменьшает значение своего формального параметра на 1. После чего внутри основной функции целочисленная переменная с именем ’a’ инициализируется значением 5. Затем это значение отображается. Вызывается функция, и в качестве аргумента передается адрес переменной.
Внутри функции значение переменной-указателя уменьшается на 1. При выходе из функции снова отображается значение переменной, которое оказывается на 1 меньше исходного значения.