В този урок ще научим за извикването на C ++ чрез препратка към предаване на указатели като аргумент на функцията с помощта на примери.
В урока за C ++ функции научихме за предаването на аргументи на функция. Този използван метод се нарича предаване по стойност, защото се предава действителната стойност.
Съществува обаче и друг начин за предаване на аргументи на функция, при която действителните стойности на аргументите не се предават. Вместо това се препраща към препратки към стойности.
Например,
// function that takes value as parameter void func1(int numVal) ( // code ) // function that takes reference as parameter // notice the & before the parameter void func2(int &numRef) ( // code ) int main() ( int num = 5; // pass by value func1(num); // pass by reference func2(num); return 0; )
Забележете &
в void func2(int &numRef)
. Това означава, че използваме адреса на променливата като наш параметър.
Така че, когато извикваме func2()
функцията, main()
като подаваме променливата num като аргумент, всъщност предаваме адреса на променливата num вместо стойността 5 .

Пример 1: Преминаване от референция без указатели
#include using namespace std; // function definition to swap values void swap(int &n1, int &n2) ( int temp; temp = n1; n1 = n2; n2 = temp; ) int main() ( // initialize variables int a = 1, b = 2; cout << "Before swapping" << endl; cout << "a = " << a << endl; cout << "b = " << b << endl; // call function to swap numbers swap(a, b); cout << "After swapping" << endl; cout << "a = " << a << endl; cout << "b = " << b << endl; return 0; )
Изход
Преди размяна на a = 1 b = 2 След размяна на a = 2 b = 1
В тази програма предадохме променливите a и b на swap()
функцията. Забележете дефиницията на функцията,
void swap(int &n1, int &n2)
Тук използваме, за &
да обозначим, че функцията ще приема адреси като свои параметри.
Следователно компилаторът може да идентифицира, че вместо действителните стойности, препратката към променливите се предава на функционални параметри.
Във swap()
функцията параметрите на функцията n1 и n2 сочат към същата стойност като съответно променливите a и b. Следователно размяната се извършва по действителна стойност.
Същата задача може да се направи с помощта на указателите. За да научите повече за указателите, посетете указатели C ++.
Пример 2: Преминаване чрез препратка с помощта на указатели
#include using namespace std; // function prototype with pointer as parameters void swap(int*, int*); int main() ( // initialize variables int a = 1, b = 2; cout << "Before swapping" << endl; cout << "a = " << a << endl; cout << "b = " << b << endl; // call function by passing variable addresses swap(&a, &b); cout << "After swapping" << endl; cout << "a = " << a << endl; cout << "b = " << b << endl; return 0; ) // function definition to swap numbers void swap(int* n1, int* n2) ( int temp; temp = *n1; *n1 = *n2; *n2 = temp; )
Изход
Преди размяна на a = 1 b = 2 След размяна на a = 2 b = 1
Тук можем да видим, че изходът е същият като предишния пример. Забележете линията,
// &a is address of a // &b is address of b swap(&a, &b);
Тук адресът на променливата се предава по време на извикване на функция, а не на променливата.
Тъй като адресът е предаден вместо стойност, *
трябва да се използва оператор за пренасочване за достъп до стойността, съхранявана в този адрес.
temp = *n1; *n1 = *n2; *n2 = temp;
*n1
и *n2
дава стойността, съхранена съответно на адрес n1 и n2.
Тъй като n1 и n2 съдържат адресите на a и b, всичко се прави *n1
и * n2 ще промени действителните стойности на a и b.
Следователно, когато отпечатваме стойностите на a и b във main()
функцията, стойностите се променят.